LINUX.ORG.RU

синглтоны это зло?


0

2

В последнее время часто вижу движуху на тему «синглтоны зло». Однако при попытке разобраться в вопросе натыкаешься на каких-то диванных теоретиков которые по существу сказать не могут. Из того что я понял есть три проблемы:

1) типа синглотон нельзя унаследовать. Я принимаю это. Но dependency injection (или как это) или враппер никто не отменял.

2) mocking невозможен. Имхо, не невозможен а затруднён. Опять-таки со своим кодом это не проблема. Проблема если синглтон откуда-то экспортируется. В общем, да, есть трудности, а кому щас легко? Давайте теперь всё сносить что трудно отладить. Впрочем, у меня синглтоны простые и в 99% служат защитой того что нигде в коде, скажем, не появится второй обработчик сетевых соединений итп. Т.е. наоборот спасает от глюков.

3) ну и всякая лабуда в духе «а вот жабе можно вот так извернуть что ...». Короче, жавапроблемы.

4) «Я удалил все синглтоны и мои волосы стали длинными и шелковистыми». И такое я вижу в качестве «аргумента».

Моя точка зрения синглтоны это часть нашей жизни. В питоне, например, модуль это синглтон. Да что там, даже обычная shared-либу можно обозвать синглтоном. Да и вообще у нас есть только одни stdin, stderr и stdout. Никто же не орёт что это несправедливо? Лепить их где попало не стоит, но так это и ежу понятно.

Что скажешь, лор?

Не люблю кастовать, но не могу удержаться.

Cast tailgunner, baverman, , mv, anonymous,

★★★★★
Ответ на: комментарий от true_admin

Чем глобальная константа-указатель принципиально отличается от синглтона?

Насколько принципиальной должна быть разница? Сам понимаешь, это всё байты памяти.

Суть же одна - у нас есть что-то только в одном экземпляре.

ЩИТО? Синглтон - это класс с единственным экземпляром. У «класса» FILE как минимум 3 экземпляра - stdin, stdout, stderr. Ты после этого считаешь FILE синглтоном?

Разницы же никакой, верно?

«Когда я выбираю какое-то слово, оно значит то, что я хочу» (ц) Шалтай-Болтай

tailgunner ★★★★★
()
Ответ на: комментарий от baverman

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

Синглтон в классическом понимании это класс, который может быть инстанцирован только в одном экземпляре. Казалось бы, при чём тут глобальный стейт? :)

anonymous
()

Зло - это не наличие синглтонов, а когда их слишком много.

annulen ★★★★★
()
Ответ на: комментарий от baverman

Глобальная переменная в модуле, с прямым доступом или через функцию.

а в чём принципиальная разница? Если я правильно понимаю то работать будет одинаково.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от baverman

Казалось бы, при чём тут глобальный стейт? :)

Гм. Сферический синглтон в вакууме? Забавно.

Сферичность тут нипричем. В «Design Patterns Smalltalk Companion» приводились разные формы синглтонов, а о том, что инстанс синглтона может убиться во время исполнения программы и потом on-demand воскреснуть вновь, писал ещё Александреску.

Глобальный стейт ИМХО не является ни обязательным, ни достаточным условием.

anonymous
()
Ответ на: комментарий от baverman

Я может сейчас задам очень дурацкий вопрос, но я его задам.

Глобальная переменная в модуле, с прямым доступом или через функцию.

а бывает по-другому? Т.е. подразумевается что «настоящий» синглтон должен быть встроен в какой-нить __builtin__ и не требует предварительного экспорта? Т.е. должен быть всегда и везде доступен, иначе это не синглтон? Ну тогда у меня синглтонов не было и нет :)

true_admin ★★★★★
() автор топика
Ответ на: комментарий от anonymous

а о том, что инстанс синглтона может убиться во время исполнения программы и потом on-demand воскреснуть вновь

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

baverman ★★★
()
Ответ на: комментарий от true_admin

а бывает по-другому?

В жабке. Все энти паттерны там и расцвели.

baverman ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.