Шаблон разработки Singleton: ловушки [закрываются]

Заключение в кавычки и различные другие редко используемые, но допустимые части RFC затрудняет. Я не знаю достаточно об этой теме для комментария окончательно, кроме "он тверд" - но к счастью другой , люди имеют записанный об этом подробно.

относительно допустимого regex для него, Почты Perl:: Rfc822:: модуль Адреса содержит регулярное выражение, которое будет, по-видимому, работать - но только если любые комментарии уже были заменены пробелом. (Комментарии в адресе электронной почты? Вы видите, почему это более твердо, чем можно было бы ожидать...)

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

20
задан skaffman 19 September 2009 в 11:45
поделиться

4 ответа

Синглтон, как правило, плохая идея, если вы проводите модульное тестирование, и вообще плохая идея не проводить модульное тестирование (или BDD или приемочное тестирование).

Создание объектов иметь глобальное состояние означает, что модульные тесты, которые вы пишете с участием этих объектов, будут изолированы и не пересекаются друг с другом. Вместо этого вам придется беспокоиться о сбросе состояния для каждого теста и поверьте мне ... это никогда не выполняется в 100% случаев. Если вы не сбрасываете глобальное состояние, вы начинаете получать очень странные и трудные для отладки ошибки в ваших тестах, которые тратят время.

Глобальное состояние также увеличивает взаимосвязь в вашем коде и делает его очень трудным для рефакторинга.

Идеальным методом было бы использование контейнера IoC / DI (Spring, Guice и т. Д.) Для запроса объектов. В этих контейнерах часто есть способы сделать объекты видимыми как "одиночные". но у них также есть способы изменить это поведение в зависимости от ситуации (например, модульное тестирование по сравнению с кодом вашего домена).

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

37
ответ дан 29 November 2019 в 22:44
поделиться

В Google Tech Talks некоторое время назад была хорошая презентация о Глобальном состоянии и синглтонах . Статический одноэлементный шаблон - зло, потому что он вызывает нежелательные побочные эффекты и делает код непроверяемым. Статический синглтон - это объектно-ориентированная версия глобальных переменных.

Решение состоит в том, чтобы просто создать один экземпляр объекта и передать его пользователям через внедрение зависимостей. Структуры DI, такие как Guice , упрощают определение хороших синглтонов (в Guice просто аннотируйте класс с помощью @Singleton). Был подобный технический разговор под названием Не ищи вещей! , в котором DI обсуждался больше.

19
ответ дан 29 November 2019 в 22:44
поделиться

В дополнение к проблемам тестирования и проектирования, упомянутым в других сообщениях, существуют проблемы с синглетонами и загрузчиками классов. Синглтоны на самом деле не «одиночные» для каждой JVM или приложения - они достигают этого с помощью статического свойства, что на самом деле означает, что существует по одному на каждый класс. Если имеется несколько загрузчиков классов - как на большинстве серверов приложений - каждое отдельное приложение получает новый загрузчик классов, в EJB используются даже несколько уровней загрузчиков классов. Экземпляр синглтона загружается для каждого загрузчика классов, что в зависимости от того, что вы делаете с синглтоном, может не дать ожидаемых результатов.

7
ответ дан 29 November 2019 в 22:44
поделиться

Я бы очень редко использовал синглтон. Из-за своей природы (статические, глобальные объекты) их сложно использовать при модульном тестировании вашего кода. В конечном итоге вам нужно выполнить некоторую синхронизацию или встроить некоторые механизмы повторной инициализации, чтобы вы могли получить новую версию для каждого модульного теста. Есть случаи, которые имеют смысл - скажем, глобальный класс конфигурации - но их гораздо меньше, чем думают люди, плохо знакомые с синглтонами. Я знаю, что прошел через этап, когда повсюду видел применения одноэлементного шаблона. Теперь я избегаю этого везде, где могу, и отменяю его посредством рефакторинга в моем коде, когда сталкиваюсь с ненужной реализацией.

3
ответ дан 29 November 2019 в 22:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: