Сведения о вопросе

krutoi

07:47, 10th August, 2020

Синглтоны: хороший дизайн или костыль?

Просмотров: 467   Ответов: 4

Синглеты-это горячо обсуждаемый шаблон дизайна,поэтому мне интересно, что о них думает сообщество Stack Overflow.

Пожалуйста, укажите причины для вашего мнения, а не только "Singletons are for lazy programmers!"

Вот довольно хорошая статья по этому вопросу, хотя она и против использования Синглетов: scientificninja.com: производительность-синглтоны .

Есть ли у кого-нибудь еще хорошие статьи о них? Может быть, в поддержку Синглетов?



  Сведения об ответе

JUST___

13:34, 2nd August, 2020

В защиту синглетов:

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

Против синглтонов:

  • В C++ нет хорошего способа получить auto-clean-up после синглетов. Есть обходные пути, и немного халтурные способы сделать это, но просто нет простого, универсального способа убедиться, что деструктор вашего singleton всегда вызывается. Это не так уж страшно с точки зрения памяти - просто подумайте об этом как о более глобальных переменных, для этой цели. Но это может быть плохо, если ваш singleton выделяет другие ресурсы (например, блокирует некоторые файлы) и не освобождает их.

Мое собственное мнение:

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


  Сведения об ответе

PROGA

02:54, 29th August, 2020

У Google есть детектор Singleton для Java, который, как я полагаю, начинался как инструмент, который должен быть запущен на всех кодах, созданных в Google. В двух словах причина убрать Синглеты:

потому что они могут сделать испытание трудно и скрыть проблемы с вашим дизайн

Более подробное объяснение смотрите в разделе "почему Синглеты противоречивы" от Google.


  Сведения об ответе

LAST

07:34, 6th August, 2020

A singleton - это просто куча глобальных переменных в маскарадном костюме.

Глобальные переменные имеют свое применение, как и синглтоны, но если вы думаете, что делаете что-то классное и полезное с singleton вместо того, чтобы использовать отвратительную глобальную переменную (все знают, что глобалы плохие mmkay), вы, к сожалению, заблуждаетесь.


  Сведения об ответе

pumpa

02:08, 8th August, 2020

Цель Singleton состоит в том, чтобы гарантировать, что класс имеет только один экземпляр, и обеспечить глобальную точку доступа к нему. Большую часть времени фокус сосредоточен на одной точке экземпляра. Представьте себе, что это называется Глобалтон. Это звучало бы менее привлекательно, поскольку это подчеркивает (обычно) негативные коннотации глобальной переменной.

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться