Расширить базовый класс PHP вместо внедрения зависимостей? - PullRequest
2 голосов
/ 08 февраля 2011

Я работаю над приложением, которое будет иметь папку «библиотека», которая будет содержать самодельный фреймворк / библиотеку (сеанс, БД, кэш, классы типов конфигурации), а затем папку «модули», которая будет содержать папки для разделовмоего приложения (например, блоги /, форумы /, учетная запись / и т. д.)

В большинстве моих модулей (блоги, форумы и т. д.) мне потребуется несколько объектов, таких как кэш, база данных, регистратор,объекты конфигурации.Я планировал использовать внедрение зависимостей для этого, но мне любопытно, не мог ли я просто иметь класс / объект Core, который мог бы выполнять такие вещи, как моя база данных, кеш, логгер, время, методы, а затем просто расширять этот базовый класс на мой другоймодули классов и есть доступ ко всем этим вещам без необходимости вводить их?

Я довольно новичок в использовании классов / объектов, поэтому я могу быть далеко отсюда, пожалуйста, объясните.

Ответы [ 4 ]

9 голосов
/ 08 февраля 2011

Классы должны иметь одну ответственность . Базовый класс, занимающийся кэшированием, доступом к БД, ведением журнала и временем и т. Д., Фактически является объектом Бога он же Blob . Это AntiPattern . Не делай этого. Сделайте их SOLID .

3 голосов
/ 08 февраля 2011

Расширение классов имеет смысл, если вы специализируете классы или, ну, в общем, расширяете их.
Это не имеет смысла и обычно становится беспорядочным, если расширение не имеет ничего общего с первоначальным назначением базового класса.

Например, вы можете расширить класс DbBase с помощью класса DbMySql (специализация) или HtmlHelper с помощью Html5Helper (расширение).

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

1 голос
/ 08 февраля 2011

Я тоже согласен с Гордоном.

Лично я избегаю использования статического метода Factory. По сути, это эквивалентно использованию глобальной переменной. Это анти-шаблон Service Locator.

В дополнение к предлагаемому контейнеру DI, я считаю, что ручное внедрение зависимостей (то есть с использованием контейнера DI) является ценным подходом. Нет никакого инструмента (то есть контейнера), который мог бы проектировать ваши классы, чтобы быть свободно связанными, и я считаю, что использование ручного DI полезно, чтобы сосредоточиться на этом.

[P.S. Я бы добавил это как комментарий, но я новичок и не могу комментировать]

0 голосов
/ 08 февраля 2011

То, что вы CAN делаете, - это создание класса Factory, который создает экземпляры и предоставляет нужные вам отдельные объекты.Что-то вроде:

$db = myFactory::getDBO();
$conf = myFactory::getConfig();
$session = myFactory::getSession();

и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...