Это хорошее программирование - иметь в проекте много синглтон-классов? - PullRequest
3 голосов
/ 17 января 2010

У меня есть несколько классов в проекте, которые должны быть созданы только один раз.

Каков наилучший способ сделать это?

  1. Их можно создать как статический объект.
  2. Может быть создан как синглтон
  3. Может быть создан как глобальный.

Каков наилучший шаблон проектирования для реализации этого?

Я думаю о создании всех классов как синглтонов, но это создаст много синглетонов. Это хорошая практика программирования иметь много синглетонов?

Каковы плюсы и минусы использования синглетонов?

Ответы [ 9 ]

16 голосов
/ 17 января 2010

Взгляните на блог Стива Йегге об этом - Синглтон считается глупым

6 голосов
/ 17 января 2010

Если их нужно создать только один раз, это не означает, что они должны быть одиночными.

  • Если X - одиночный, подразумевается, что есть один экземпляр.
  • Если у X есть один экземпляр, это не значит, что он должен быть синглтоном.

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

Чаще всего они вам не нужны.Вы увидите это в плохом коде из-за самого менталитета: мне нужен только один, это должно означать, что я должен сделать его синглтоном!( Неправильно ) Например, я закончил техническое проектирование самого мощного игрового движка, который я когда-либо делал.Имеет 2 синглета для памяти и потоков.Очень большой проект, а у меня только два!

Больше контекста поможет нам дать вам лучшую информацию.

5 голосов
/ 17 января 2010

Предлагаю вам посмотреть некоторые видео и статьи, которые сделал Мишко Хевери из Google. Первое видео: «Чистые переговоры по коду: глобальное состояние и одиночные игры» и его блог .

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

4 голосов
/ 17 января 2010

У синглетонов есть несколько проблем - их сложно тестировать, сложно заменить и сложно расширить. Обычно есть лучший способ.

3 голосов
/ 17 января 2010

Одна из моих любимых статей о синглтоне - Синглтоны - патологические лжецы Мишко Хевери. По сути, они поощряют «скрытое» поведение, которое очень трудно выучить и проверить.

1 голос
/ 17 января 2010

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

Однако синглтоны являются признаком проблемы:

  • Во-первых, синглтон как канонический шаблон не подходит для интерфейсов и абстракций. Это может быть исправлено, хотя - доступ к нему через фабрику.
  • Хуже того, синглтоны негибки - у них нет никаких средств идентификации объекта, кроме его типа. (Ну, в C ++ они делают через шаблоны, но это другая история). В этом смысле они на самом деле хуже, чем статические переменные. В конечном итоге это окупается с помощью инфраструктуры, в которой можно получить доступ ко многим экземплярам одного типа.
  • И что самое важное, множество одиночек означает множество отдаленных отношений между объектами. Это означает, что ваша система, вероятно, более сложна, чем должна быть, и ее будет намного сложнее разрабатывать, тестировать и управлять. Простое переключение на локаторы или DI там не поможет, это вопрос основополагающих принципов проектирования.
1 голос
/ 17 января 2010

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

Это затрудняет выполнение таких вещей, как сборка модульных тестов, создание фиктивных классов и повторное использование кода, поскольку его действительно легко связать текущее состояние с функцией. то есть функция foo действует только тогда, когда class X находится в state Z, в противном случае она не работает.

Также проблематично правильно построить потокобезопасный синглтон.

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

Так почему вы думаете, что вам нужно лотов синглетонов? Вы можете получить лучшие ответы, если спросите о проблемной области и о проблеме, с которой вы столкнулись.

0 голосов
/ 17 января 2010

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

0 голосов
/ 17 января 2010

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

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