oop — правильный дизайн класса для веб-проекта в Stack Overflow

Мы находимся в процессе переписывания нашего кода в ООП, и я пытаюсь разработать общую структуру для будущих проектов (в основном, чтобы соответствовать DRY и поддерживать тонкий и согласованный код).

Например, я думаю, что было бы неплохо иметь базовый класс DatabaseObject, который будет источником его свойств из строки базы данных. Было бы (среди прочего) использовать __call() а также property_exists() автоматизировать большинство добытчиков. Таким образом, нам не нужно было бы писать все 100+ получателей для каждого столбца в строке базы данных (или обновлять код класса при каждом изменении таблицы).

Другие классы, такие как Customer, Car или же Article будет продлен DatabaseObject (если они получены из базы данных) и наследуют эти методы, поэтому нам не нужно копировать код, специфичный для базы данных, в каждый класс в отдельности (что со временем будет становиться все более и более непоследовательным).

Это правильное использование наследования в веб-проекте, или это плохой дизайн? Мой коллега утверждает, что это в некоторой степени неправильное использование наследования и что клиенту, полученному из CSV-файла, потребуется отдельное определение класса, которое является действительным аргументом.

С интерфейсами нам все равно пришлось бы копировать код в каждый класс, и черты (не считая PHP 5.4) не будут работать для меня __call() пример выше (думаю).

Так есть ли лучший подход к моему DatabaseObject концепция?

Редактировать: Может ли кто-нибудь объяснить мне причину этих отрицательных голосов, чтобы я мог удалить и повторно представить свой вопрос надлежащим образом?

-4

Решение

Вы на правильном пути в отображении таблицы базы данных в объект. Собственно, люди до вас уже изобрели колесо. В PHP есть несколько ORM, которые могут сделать эту работу за вас без необходимости заново изобретать колесо — например, Учение, Пропел …

Однако проблемы, с которыми вы можете столкнуться в вашей текущей схеме, состоят в том, что состояния ваших объектов. Ваши лица — Car или же Article будет трудно сохранить свое состояние, если вся логика вокруг него будет в абстракции. Вам понадобятся свойства, которые сопоставляются со столбцами таблицы, чтобы сохранить объект измененным, но изменения не зафиксированы. И только после, например save() Метод вызван, чтобы зафиксировать изменения.

Кроме того, если вам нужна дополнительная логика вокруг этого, скажем, вам нужно проверить имя автора статьи, вам нужно, чтобы setAuthor() Метод физически написан где угодно, чтобы что-то изменить на нем.

Упомянутые мной ORM решили эти проблемы с помощью инструмента генерации кода, который проверяет схему БД и создает классы с их физическими получателями и установщиками в сущности. Например, Propel создает класс с именем таблицы со всеми получателями и установщиками в нем и с логикой, но также создает класс, который расширяет его в общедоступном каталоге, поэтому при создании экземпляра Article вы создаете экземпляр пустого класса, который расширяет ArticleBase, ArticleBase иметь setAuthor() метод, который выполняет изменения на автора, например UPDATE / INSERT. Но когда вам нужно выполнить дополнительную логику в setAuthor() вы просто переопределяете это в Article, выполни свою логику и позвони parent::setArticle(),

Это также решает проблему с автозаполнением. Мир современных разработчиков заставил меня слишком полагаться на автоматическую комплектацию. Я не могу и не буду помнить общедоступный API каждого используемого мной модуля, а также всю базу данных, лежащую под приложением. Так что, может быть, я не знаю, если ваш articles стол имеет user_id колонка для автора или author_id, Таким образом, я буду ожидать написания $article-> предложить мне методы, которые я могу использовать. Ваша схема с __call() приведет к отсутствию предложений автозаполнения, потому что ни методы, ни генерация, ни аннотации не будут.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]