Почему Singelton - плохая практика?

  • Автор темы Духовность™
  • Дата начала

Духовность™

Guest
Давайте обсудим этот вопрос. Отдельно. Без флуда.

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

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Не считаю синглтон плохой практикой)
 

phprus

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

Какие минусы вам представляются в использовании этого паттерна?
1) Увеличение связности кода. В местах вызова жестко задается имя класса.
2) В языках без сборки мусора неизвестно когда будет уничтожен объект. К примеру в С++ сложно добиться корректного уничтожения объекта-синглтона, особенно когда синглтонов несколько, и они могут вызываться из методов друг друга, а так-же из деструкторов классов, у которых есть глобальные объекты.


P.S. А вообще все относительно. Если синглтон к месту, то это хорошая практика, а если его пытаются засунуть туда, куда не надо, то ко всему прочему еще и вышеперечисленные проблемы себе добавляют.
 

Духовность™

Guest
1) Увеличение связности кода. В местах вызова жестко задается имя класса.
Связанность кода присутствует всегда. Среднестатистический контроллер делает несколько инстансов разных объектов - это тоже связанность кода. Жестко заданное имя класса - что в этом такого страшного?

В языках без сборки мусора неизвестно когда будет уничтожен объект.
это так важно?
 

AmdY

Пью пиво
Команда форума
Духовность™
хороший и удобный способ - это когда ты хочешь создать класс в одном строго определённом месте. у мен после хорошего рефакторинга кода, как правило синглетон просто некуда засунуть, даже конструктор не делаю закрытым, всё равно потом править придётся. а там, где он используется, код сомнительного качества писанный правой ногой.

но в целом, согласен, лучше синглетон, чем хитрая и завёрнутая система вызовов и передач аргументов.
 

tz-lom

Продвинутый новичок
AmdY
всё зависит от общей архитектуры
если синглтон используется как мостик между 2мя-3мя классами это страдание фигнёй и лень
а если на нём висят все объекты это такая архитектура
 

phprus

Moderator
Команда форума
Жестко заданное имя класса - что в этом такого страшного?
Да в общем то ничего, но я не сторонник методики использования имени класса в каждой точке, где нужен объект, а не класс. Это совсем не значит, что я не использую синглтоны, но стараюсь строить такие архитектуры где они будут применяться реже.

Да. Особенно это становится важно, когда объект синглтона уже уничтожен, а из какого-либо деструктора другого класса запрашивается этот объект. Счастливая отладка гарантирована. По этому и глобальные переменные тоже зло. (Я говорил про С++, так как последнее время все больше пишу на нем).
 

флоппик

promotor fidei
Команда форума
Партнер клуба
(Я говорил про С++, так как последнее время все больше пишу на нем).
Это не форум по С++, давайте перестанем придумывать граничные условия из головы, после которых сказанная глупость якобы имеет право на существование? Давай еще скажем, что в паскале статических классов нет, поэтому синглтоны там работать не будут, и поэтому они плохая практика.
 

craz

Нестандартное звание
Это не форум по С++, давайте перестанем придумывать граничные условия из головы, после которых сказанная глупость якобы имеет право на существование? Давай еще скажем, что в паскале статических классов нет, поэтому синглтоны там работать не будут, и поэтому они плохая практика.
кстати очень правильное замечание про Паскаль, считаю что в пхп по этой причине нельзя использовать синглтоны!
 

HraKK

Мудак
Команда форума
Хватит спорить, почитайте на агиле про зависимости.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
А при чем тут агиле? кто сказал, что мы разрабатываем с использованием агиле-методологии?
паттерны с ней никак не связаны, они сами по себе.
 

Mols

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

HraKK

Мудак
Команда форума
И на самом деле синглтон хороший тон и хорошая практика, для решения задачи которую они решают.
С этим никто не спорит. Но ты рассматриваешь в выдранном контексте. Начиналась эта тема с другого.
 

Mols

Новичок
HraKK
угу. Я воспринял эту мысль как независимую от контекста.
Собственно потому и удивился очень.
 

korchasa

LIMB infected
имхо заявления " синглтоны это дурной тон" малость преувеличены.
Просто не стоит их использовать направо и налево - это да.
Я даже больше скажу... я почти никогда не использую синглтон, но не считаю их дурным тоном.
И на самом деле синглтон хороший тон и хорошая практика, для решения задачи которую они решают.
Количество синглтонов надо сводить к минимуму, либо избавляться от его минусов. Не потому что это "дурной тон", а потому, что это статическая зависимость на класс. Введение метода setInstance() позволяет отвязаться от класса и перейти к интерфейсу.
 

AmdY

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

korchasa

LIMB infected
это напоминает вопрос, почему GOTO плохой тон, потому что провоцирует на потенциальные нарушения архитектуры, лямбда функции сюда же.
Неее, ты путаешь. Синглтон не "правоцирует нарушения", он является "нарушением". Без setInstance() (который можно при необходимости добавить, и запихнуть инстанцирование в bootstrap) он увеличивает стоимость вносимых изменений.

У глобальных переменных, singleton'ов и registry есть еще один минус по сравнению с IoC - низкая защищенность. Но это можно контролировать на уровне соглашений.
 
  • Like
Реакции: AmdY

Духовность™

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

Введение метода setInstance() позволяет отвязаться от класса и перейти к интерфейсу.
Минусы этого подхода описать не хотите?
 
Сверху