• Записи 1544
  • Теги 109
  • Комментарии 3323

Лог жизни

Когда избыток знаний тормозит разработку

Как уже писал, никак не получается вернуться к своим проектам. Ни доделать релиз IntB (а для этого — добавить поддержку PostgreSQL и SQLite и исправить кое-какие мелочи), ни вернуться к мобильному сообществу. Причём на последнем я застрял на проблеме избыточного выбора. Нужно реализовать простейшую задачу (выборка данных о сообщениях и их авторах, самый обычный LEFT JOIN по id), но в голове крутится целых 6 вариантов реализации (не считая неприемлемого — использования стороннего ORMа), и никак не могу определиться, какой лучше. Точнее даже так: вижу плюсы и минусы каждого, но никак не могу выбрать, чем пожертвовать: красотой и логичностью кода или возможностью выдернуть все данные одним запросом, а не несколькими.
Эх, вспоминаю, как всё просто было во времена IntB 2.x: там я в каждой таблицы для каждого столбца делал префикс с одинарным или двойным подчёркиванием (например, для пользователей все поля начинались на u_ или u__ в зависимости от того, может ли их менять сам пользователь, для сообщений — на p_), и по этому префиксу на стороне PHP поля было элементарно разделить (а также это защищало от одинаковых имён столбцов в одном запросе). Сейчас такое решение воспринимается как топорное и «студенческое». Но все те решения, которые воспринимаются как нормальные, имеют свои недостатки: либо нужно делать как минимум два запроса, либо где-то хранить список полей в самом классе, либо использовать attributes, которые появились только в PHP 8. Впрочем, пока я это писал, пришла в голову новая мысль: использовать Reflection и проверять с его помощью, в каком из классов есть соответствующее поле. Для простых случаев типа мобильного сообщества этого будет достаточно.

2 комментария:

Нет
Aksion
0

если ты видишь недостатки во всех вариантах - сделай свой вариант без недостатков, может в этом твое призвание - раз ты видишь недостатки.
Ведь те кто делал варианты видимо считают их нормальными, и просто не видят косяки

4X_Pro
0

Что касается, «не видят косяки», то зачастую это вопрос эстетики/правильности, а не работоспособности. Например, тот вариант из IntB 2.x с префиксами вполне себе будет работать и в наше время, просто сейчас он не воспринимается как что-то правильное и хорошо сделанное.
Самый эстетичный вариант — это использовать field attributes, но они появились только в PHP 8. А я — сторонник того, что нужно обеспечивать настолько большую обратную совместимость, насколько это возможно. К тому же сам совсем недавно слез с Ubuntu 18, где штатной версией PHP была 7.2. Поэтому до сих пор на неё и ориентируюсь.
Впрочем, сегодня утром нашёл ещё два решения. Точнее, одно оказалось более простым вариантом того, что я придумал вчера ночью, когда писал про reflection. Они, хоть тоже несколько неидеальны, но, по крайней мере, вписываются в мои представления о приемлемости. Так что завтра, наверное, займусь реализацией. А ещё придумал использовать view на стороне базы данных, чтобы с одной стороны, не тащить из БД лишнюю информацию, с другой — не заменять SELECT * на перечисление всех полей (что ведёт к потере гибкости).

Написать комментарий
Прикрепить файлы: (не более 4 файлов, не более 102400 Кб каждый, 102400 Кб всего)


Задать вопрос