Реализация PHP Front Controller без синглтона: концептуальный вопрос
У меня есть "концептуальный" вопрос о реализации Front контроллера в php.
Большинство фронтальных контроллеров, которые я видел, реализованы с помощью Singleton, я не большой поклонник синглтон-паттернов, и я создал контейнер, который имеет статическое свойство, которое будет хранить уникальный экземпляр Front Controller.
В случае синглтона мне пришлось поместить код инициализации в конструктор (или метод, вызываемый конструктором):
$fc = FrontController::getInstance();
С контейнером я мог поместить конфигурацию вне FrontController, это была моя цель, и у меня все еще есть простой способ получить FrontController.
$fc = Container->getFrontController();
Этот код выглядит намного чище для меня, и я могу получить чистый подкласс, не заботясь о родительских конструкторах.
Это то же самое во время "начальной загрузки", но на практике отличие от моей предыдущей реализации состоит в том, что теперь я могу создавать FrontController в любом месте приложения (внутри DAO или внутри Action), потому что конструктор больше не является приватным / защищенным,
Мой вопрос: является ли "плохой практикой" предоставление пользователям моих классов возможности создавать экземпляры FrontController в любом месте приложения? Я написал бы документацию и поставил бы контейнер с другими классами, но я все еще задаюсь вопросом, должен ли я предотвратить странные использования.
2 ответа
Есть ли реальная причина для создания экземпляров FrontController внутри приложения? Если есть, то вперед. В противном случае я немного скептически отношусь к этому, поскольку это может усложнить ситуацию позже. Чего я боюсь, так это того, что кто-то использует новые экземпляры FrontController, когда есть гораздо более простой способ, либо из-за лени, либо потому, что они не знают ничего лучшего. Как только они находят что-то, что работает, некоторые люди имеют тенденцию продолжать делать это, даже если есть лучший способ. Никогда не забывайте, что вам, возможно, придется работать с людьми, которые не так хороши, как вы.
Лично я бы это скрывал или вообще не позволял. Однако я бы помнил об этом для последующих выпусков. Если вы когда-нибудь наткнетесь на случай, когда это лучший вариант, обязательно добавьте его в свой "официальный" интерфейс.
Не забывайте, что когда вы выпускаете функцию в дикую природу, убить ее мучительно сложно.
$fc = Container::getFrontController();
звучит хорошо для меня.
Я не думаю, что было бы плохой практикой разрешать разработчикам извлекать экземпляр Front Controller где угодно, если вы правильно контролируете, что разработчики могут с ним делать (например, не перезаписывать какое-либо свойство или выполнять его методы в неправильном порядке, не показывая ошибка / предупреждение пользователю).