Я столкнулся с дилеммой относительно ООП-дизайна моего приложения. Должен ли я сделать класс аутентификации одноэлементным или нет. Я вижу, что фреймворк kohana и фреймворк zend используют свои классы аутентификации как синглтон. Каковы недостатки создания одноэлементного класса аутентификации? Какие плюсы? Кроме того, приложение, которое я создаю, будет корпоративным, и его необходимо масштабировать, так будет ли моя система аутентификации также масштабироваться, если это будет синглтон?
плюсы и минусы создания моей системы аутентификации одноэлементным классом
Ответы (4)
Вот некоторые минусы:
- чрезвычайно сложно протестировать, потому что код привязан к имени класса
- введение глобального состояния
- невозможность определить причины эффекта - несвязанные методы могут влиять друг на друга
- разброс запросов аутентификации по всей кодовой базе
- нарушение LoD
Вы можете получить большую пользу от изучения того, на каком этапе и как именно вы аутентифицируете пользователя (не путайте с авторизацией). Кроме того, эта тема может вас заинтересовать.
Обновление:
Вот несколько видео, которые могут вас заинтересовать:
- Беседы о чистом коде: модульное тестирование
- Беседы о чистом коде: глобальное состояние и одиночки
- Беседы о чистом коде: ничего не ищите!
- PHP UK Conference 2011: Advanced OO Patterns
Auth::getInstance()
, вы связываете свой код с классом Auth. Конечно, вы можете использовать абстрактную фабрику, но если вы передадите экземпляр фабричного класса вокруг своего кода, тогда он потеряет смысл наличия синглтона. Сама фабрика может гарантировать, что существует только один экземпляр объекта.
- person tereško; 30.03.2012
Auth::getInstance()
может оставаться в простой функции & get_instance () независимо от имени класса, верно? и что вы имеете в виду, говоря если вы передадите экземпляр фабричного класса в свой код, тогда он потеряет смысл иметь синглтон ?? как это заставляет его терять точку синглтона?
- person linuxeasy; 30.03.2012
$foo = & $bar_object;
. Если вы сделаете то же самое в PHP5, вы увеличите использование памяти скриптом. В PHP5 мы делаем то же самое с $foo = $bar_object;
. Это потому, что передается только обработчик объекта.
- person tereško; 30.03.2012
Избегайте использования синглтона и используйте его только в том случае, когда оборудование имеет ограничение на один объект -> ресурс для каждого приложения. Если вы включите синглтон, вы не сможете обменять класс аутентификации на что-то еще в вашей системе, вы будете с ним стекаться. Учтите, что завтра вы можете получить новое требование, в котором говорится, что вам нужно реализовать аутентификацию, используя другую логику, другое соединение и так далее. Также о том, как протестировать вашу систему после использования синглтона, как вы будете издеваться над ним?
Не выбирайте синглтон! Это не лучше, чем прославленное объектно-ориентированное пространство имен, на самом деле Синглтон почти так же плохо, как использование глобальных переменных, и лишь немного лучше, чем использование глобальных библиотек функций (которые в сам по себе тоже плохо). Созданный объект лучше отправить в свои классы.
Поскольку объекты PHP 5, передаваемые другим объектам, по умолчанию передаются по ссылке. Они не создают новый экземпляр (если не используют ключевое слово clone). Это позволяет передавать любую информацию о сеансе как объект другим объектам, которые в ней нуждаются.
Лучшее, что я могу порекомендовать, - это создать класс Session, который будет переносить информацию о сеансе. Отправьте этот класс своим объектам MVC. Это позволяет вам протестировать систему без присутствия сеанса (или вы можете создать для этой цели состояние макета). Хотя передача одного объекта другому делает их более связанными, чем идеальными, пока класс достаточно примитивен, его можно легко создать в других системах или частях приложения, использующих те же классы.
Это также упрощает передачу состояний или сеансов в любой момент времени, даже в рамках одного запроса.
В PHP объект не остается в памяти после завершения запроса.
Таким образом, даже если вы сделаете свой объект синглтоном, каждый запрос будет иметь свой собственный экземпляр этого класса.
Но разница появится, когда к объекту обращаются несколько раз в одном запросе. В этом случае синглтон имеет следующие преимущества:
Предотвращает создание нескольких избыточных экземпляров, что снижает использование памяти для запросов.
Распределяет одни и те же данные при множественном доступе.
Например: функция get_instance в Codeigniter является реализацией концепции Singleton, в соответствии с которой в каждом запросе используется только один экземпляр Codeigniter.
new
, вы создаете полный экземпляр, тогда как если вы используете синглтон, остается единственный экземпляр, и только синглтон экономит память.
- person linuxeasy; 30.03.2012