Должны ли все передние классы использовать синглтон? - PullRequest
1 голос
/ 03 октября 2010

Рассмотрим шаблоны корпоративной прикладной архитектуры Мартина Фаулера и образец Front Controller: http://martinfowler.com/eaaCatalog/frontController.html По-видимому, он использует шаблон синглтона.Ну, у меня есть пакет классов в приложении php, которые работают вместе (например, Zend's Controller Package), и есть один класс, который делает их пригодными для использования, и так как он напоминает многие концепции Front Controller, я назвал его PackageName_Front.Но это не должен быть одноэлементный класс (в отличие от Front Controller), поэтому я все же позволю ему иметь имя Front?Если нет, как я это называю?Поскольку это довольно большой пакет, мне просто нужно как можно больше следовать соглашениям (не догматично!), Чтобы его могли прочитать другие разработчики.

Дополнительная информация: Это не относится к контроллерам,Это просто объект, который работает как Zend_Form (который объединяет использование всех других объектов, таких как Zend_Form_Element_X и Zend_Validate, в один объект) Но я не могу просто назвать его PackageName.Это должно быть PackageName_Something, и я просто не знаю, каким должно быть Something.Может быть, «Обработчик»? ... Я просто хочу убедиться, что когда кто-то читает его имя, не запутывается в его роли во всем Пакете:)

Ответы [ 3 ]

1 голос
/ 03 октября 2010

Просто с точки зрения дизайна кажется, что вы используете PackageName_Front в качестве фасада, когда говорите:

есть один класс, который делает их пригодными для использования

Реализация шаблона Фаулером гласит:

Front Controller консолидирует всю обработку запросов путем направления запросов через один объект-обработчик

Это указывает на то, что Singleton может бытьиспользуется для реализации класса Front Controller, но он определенно не ограничивает его использование.Хотя он явно не упоминает об этом.

Я не думаю, что это важно, является ли это Синглтоном или нет.Просто убедитесь, что это единственный канал для запросов, и вы успешно использовали шаблон.:)

1 голос
/ 04 октября 2010

Очевидно, что [FrontController] использует шаблон синглтона.

FrontController не должен быть реализован как синглтон.Книга не предлагает ничего подобного.Пример в книге использует сервлет для обработчика.

Тот факт, что класс понадобится только один раз в приложении, не оправдывает его реализацию как Singleton.В нем отсутствует цель Singleton, которая заключается в принудительном применении , класс может иметь только один экземпляр и , обеспечивающий глобальный доступ к нему.Если вам нужен конкретный экземпляр только один раз, рассмотрите Просто создайте один .

В настоящее время многие люди (включая Эриха Гамму из известности GoF) рассматривают Singleton как запах кода и не рекомендуют его использовать.В архитектуре без общего доступа Singleton может ограничивать только экземпляры внутри текущего запроса, поэтому использование в PHP ограничено.Глобальный доступ к объекту может быть достигнут без шаблона Singleton, либо с помощью (злого) глобального ключевого слова или статических методов.Глобальный доступ всегда создает ненужную связь.Лучшим способом было бы использовать Dependency Injection, которое имеет дополнительное преимущество, заключающееся в меньшем сцеплении и, следовательно, лучшем обслуживании.

, так что я все еще оставлю ему имя Front?Если нет, как я это называю?Поскольку это довольно большой пакет, мне просто нужно как можно больше следовать соглашениям (не догматично!)

Не существует такого соглашения в отношении именования классов Front классы, насколько мне известно.То, что вы описываете, может быть Facade или Gateway .Кроме того, вы уверены, что не можете назвать класс после PackageName?В конце концов, пакет Zend_Form также имеет класс Zend_Form.

0 голосов
/ 03 октября 2010

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

Если, однако, ваш код всегда будет вызывать конструктор только один раз, тогда есть место для вашего не-одиночного объекта-шаблона.

Мои 2 цента здесь, так как я не автор книг или что-то в этом роде.

...