mcdb
@mcdb
То ли программист, то ли видение...

Почему singleton круче global?

Собственно все жутко плюются и зеленеют при виде глобальных переменных и ратуют за использование вместо них Singleton-ов.

Собственно почему?

p.s. тема без холиворная, просто интересно, сейчас вот на гребне этой моды буду у себя вычищать глобалы (шаблон, юзер, конфиг)
  • Вопрос задан
  • 7312 просмотров
Пригласить эксперта
Ответы на вопрос 14
Действительно, понятия немного из серии «что лучше, Алла Пугачева, или цветной телевизор». Однако если я правильно понял мысль автора, постараюсь ответить :)

Все очень зависит от используемого языка. Но в целом сразу видятся такие причины:

1. Глобальную переменную может случайно переопределить другой модуль. Получим сложно отлавливаемую ошибку. Класс же, посредством которого реализован паттерн синглтон в большинстве языков переопределить нельзя. Ну или по крайней мере можно получить ошибку компиляции (в компилируемых языках).

2. Область видимости имен классов обычно не зависит от контекста. Глобальная же область переменных в некоторых языках опять же может меняться.
Ответ написан
Комментировать
OpenMinded
@OpenMinded
Т. к. Singleton — класс, на него можно повесить инициализацию, отложенное создание объекта или реализовать потокобезопасность. А global — это просто переменная, которая либо readonly, либо нет.
Ответ написан
Комментировать
printf
@printf
Ем детей.
Если singleton используется как глобальная переменная, он ничем не лучше глобальной переменной.
Даже не так. Он и есть глобальная переменная, равно как и конструкция do… break является goto.
Синтаксический сахар не должен отвлекать от сути явления.
Ответ написан
Комментировать
AmdY
@AmdY
PHP и прочие вебштучки
Бред, вам дали ссылку выше на описание паттерна, глобалы решают другую проблему — сквозную передачу данных, в ООП имя ему Registry (Реестр). Реестр точно такой же кривой костыль, нарушающий архитектуру как и глобалсы, как и GOTO, лучше их не использовать. Заменить можно передачей в конструктор, инъекцией через set или IoC.
Вот неплохая статья wiki.agiledev.ru/doku.php?id=ooad:manage_dependencies_in_php_code
Ответ написан
Artemzr
@Artemzr
singleton все же удобнее/безопаснее.
Есть языки, в которых порядок инициализации глобальных объектов не определен (с++ например), в итоге, если у нас два глобальных объекта в разных файлах, и если одни из них в конструкторе вызывает методы второго объекта, то у нас ровно 50% получения ошибки. На помощь приходит singleton.
Улучшается читабильность кода. Не совсем понятно иногда, откуда взялся этот глобальный объект (распространяется он путем подключении заголовочного файла), приходится рыскать по хидерам и узнавать что да как (это если ваш код читает другой программист), а так — вы написали в конструкторе что-то типа foo = Foo::getInstance();, сразу станет ясно.
Ну и наконец, это более соответствует принципу ооп, когда все сокрыто в классах/структурах, и нет ничего вне их (никаких глобальных функций или переменных).
Ответ написан
Комментировать
Chvanikoff
@Chvanikoff
Эмм… Singleton — паттерн проектирования, global — область видимости переменной (если «в кратце о главном»). Казалось бы, что общего между этими понятиями?
Ответ написан
conf
@conf
Ruby developer
Да ничем он не круче. Просто глобальная переменная в объектной обертке. От него одни проблемы:
— тяжело подменить заглушкой (моком) при тестировании;
— глобальными становятся не только сам синглтон но и все то, что можно через него получить
— проблемы при разработке параллельных программ (но в php это обычно мало касается)
Почитайте по этому поводу у Misko Hevery, он гораздо лучше чем я пишет про это.
misko.hevery.com/2008/08/25/root-cause-of-singletons/
misko.hevery.com/2008/08/17/singletons-are-pathological-liars/
misko.hevery.com/2008/08/21/where-have-all-the-singletons-gone/
Заменить синглтоны и реестр (Registry) поможет инъекция зависимостей (Dependency Injection, DI), но это уже тема для другой беседы :)
misko.hevery.com/2009/01/14/when-to-use-dependency-injection/
Если коротко, то все зависимости должны предоставляться объекту, а не тянуться им самим. Есть также фреймворки помогающие в этом, например, Phemto и компонент в Symfony.
Ответ написан
NeOn4eG
@NeOn4eG
Извиняюсь, а что такое Singleton?
Ответ написан
fenrirgray
@fenrirgray
Не понял причем тут синглтоны…
Почему стоит избегать глобальных переменных — варьируется от языка к языку. Например потому, что из за них могут возникать сложно диагностируемые ошибки. Или потому, что глобальные переменные все время висят в памяти, а локальные высвобождаются при выходе из функции.
Ответ написан
Комментировать
@noRerih
Мне кажется странной постановка вопроса с определением «круче». Одни практики программирования лучше других, но не думаю что паттерны меряются крутотой с переменными. Хотя программисты друг с другом да, чем только не меряются. В смысле крутотой :))

В любом случае садиться переписывать код и вносить изменения, потому что «так круче» — не следует, Вы должны точно понимать что меняете и почему это делаете. Другими словами, неосознанное использование синглтона может оказаться даже хуже.
Ответ написан
Комментировать
mcdb
@mcdb Автор вопроса
То ли программист, то ли видение...
Спасибо за разьяснения, имелся в виду PHP (по тегам видно). Так же спасибо за — в [censored]
Ответ написан
Belikov
@Belikov
Плагины для Office и MindManager, CRM, юзабилити.
Помимо отложенной инициализации, синглтон еще позволяет создавать объекты разных классов в зависимости от условий.
Если сделать синглтоном класс для взаимодействия с БД, можно будет, например, в оффлайн-режиме создавать объект для работы с локальным кэшем, а в онлайн — объект для работы с базой. Можно даже незаметно для внешнего пользователя подменять эти объекты при наличии или отсутствии соединения. Хотя это уже сложнее, т.к. нужно будет отлавливать ошибки при попытке обращения к базе.

В C# глобальных переменных просто нет. :)
Ответ написан
hamMElion
@hamMElion
singleton — класс, который может иметь не более одного экземпляра.
prototype — класс, который может иметь любое количество экземпляров.
global variables — переменные, доступные в любом месте программы.

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы