Реализация фронтального контроллера PHP без singleton: концептуальный вопрос

у меня есть" концептуальный " вопрос о реализации фронтального контроллера в php.

большинство фронтальных контроллеров, которые я видел вокруг, реализованы с помощью Singleton, я не большой поклонник шаблона singleton, и я создал контейнер, который имеет статическое свойство, которое будет хранить экземпляр Unic фронтального контроллера.

С помощью singleton мне пришлось поместить код инициализации в конструктор (или метод, вызываемый конструктором):

$fc = FrontController::getInstance();

С контейнер я мог бы поместить конфигурацию вне FrontController, это была моя цель, и у меня все еще есть простой способ получить FrontController.

$fc = Container->getFrontController();

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

это то же самое во время "начальной загрузки", но на практике отличие от моей предыдущей реализации заключается в том, что теперь я могу создавать FrontControllers в любом месте приложения (внутри DAO или внутри действия), потому что конструктор больше не является частным / защищенным.

мой вопрос: Это плохая практика, чтобы дать пользователю моего класса и возможность создавать экземпляры FrontController в любом месте приложения? Я бы написал документацию и доставил контейнер с другими классами, но я все еще задаюсь вопросом, должен ли я предотвратить странное использование.

2 ответов


есть ли реальная причина для создания экземпляров FrontController внутри приложения? Если есть тогда вперед. В противном случае я немного скептически отношусь к этому, поскольку это может усложнить ситуацию позже. Я боюсь, что кто-то использует новые экземпляры FrontController, когда есть гораздо более простой способ, либо из-за лени, либо потому, что они не знают лучше. Как только они находят что-то, что работает, некоторые люди, как правило, продолжают делать это, даже если есть лучший способ. Никогда не забывайте, что вы можете работать с людьми, которые не так хороши, как вы.

лично я бы скрыл это или не позволил бы это вообще. Однако я буду иметь это в виду для более поздних релизов. Если вы когда-нибудь наткнетесь на случай, когда это лучший вариант, обязательно добавьте его в свой "официальный" интерфейс.

Не забывайте, что как только вы выпускаете функцию в дикую природу, ее мучительно трудно убить.


$fc = Container::getFrontController();

звучит нормально для меня.

Я не думаю, что было бы плохой практикой позволять разработчикам извлекать экземпляр Front Controller в любом месте, если вы правильно контролируете, что разработчики могут с ним делать (например, не перезаписывать какое-либо свойство или выполнять его методы в неправильном порядке, не показывая пользователю ошибку/предупреждение).