Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> так ли плох синглтон 
:(
    Опции темы
GoldFinch
Дата 5.8.2009, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



в английской википедии, в статье про синглтон ( http://en.wikipedia.org/wiki/Singleton_pattern )
есть пяток ссылок ([1]-[6], http://en.wikipedia.org/wiki/Singleton_pattern#cite_note-0) на статьи в которых говорится что синглтон это антипаттерн

так например пишут что синглон это не ООП, а замена глобальных переменных на глобальные функции,
что синглтон реализует "i know where you lives" антипаттерн, и повышает число скрытых зависимостей

/discuss
PM MAIL ICQ   Вверх
Lazin
Дата 5.8.2009, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



В общем случае наверное да, но есть ситуации, в которых это не так.
Я для себя выработал такое правило: объект может быть глобальным, только если его состояние не изменяется или для приложения не важно его состояние, например логгер и стандартные потоки ввода вывода, у них есть состояние, но как правило, приложению фиолетово, что выводили в лог или в поток минуту назад. 
Сам подумай, передавать в каждый объект указатель на std::cout или %loggername% - глупо.
PM MAIL Skype GTalk   Вверх
azesmcar
Дата 5.8.2009, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Ссылки на высказывания людей с сомнительным авторитетом. Андрей Александреску около 30-и страниц этому шаблону проектирования, а Алексу Миллеру (кто это такой вообще?) вдруг взбрело в голову что это зло. Бегу удалять синглтоны smile 
Разумеется не надо строить свой код на одних синглтонах, но есть ситуации когда без него никак. Тот же логер, настройки и многое другое.

Это сообщение отредактировал(а) azesmcar - 5.8.2009, 10:31
PM   Вверх
GoldFinch
Дата 5.8.2009, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Lazin, std::cout  - не синглтон. это обычная глобальная переменная. и это часть стандартной библиотеки
у std::cout есть состояние, оно изменяется манипуляторами и флагами.

но допустим, логгер может быть синглтоном, а все остальное - не может. значит синглтон плох, а логгер - это исключение из правила?
PM MAIL ICQ   Вверх
mes
Дата 5.8.2009, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



В принципе в приложении должен быть только один синглетон - приложение.  smile 
А вот решение проблемы синглетонами - зло.

Добавлено @ 10:32
Цитата(GoldFinch @  5.8.2009,  09:29 Найти цитируемый пост)
но допустим, логгер может быть синглтоном, а все остальное - не может. значит синглтон плох, а логгер - это исключение из правила? 

нет не исключение, а быстрое решение проблемы, без существенных недостатков, т.е маленькое такое почти безвредное зло  smile 


Это сообщение отредактировал(а) mes - 5.8.2009, 10:34


--------------------
PM MAIL WWW   Вверх
Любитель
Дата 5.8.2009, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(mes @  5.8.2009,  10:30 Найти цитируемый пост)
В принципе в приложении должен быть только один синглетон - приложение. 

В идеале - да. smile 


--------------------
PM MAIL ICQ Skype   Вверх
Acer
Дата 5.8.2009, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 5.9.2007
Где: UA::DN

Репутация: нет
Всего: 8



Цитата(Lazin @ 5.8.2009,  09:23)
В общем случае наверное да, но есть ситуации, в которых это не так.
Я для себя выработал такое правило: объект может быть глобальным, только если его состояние не изменяется или для приложения не важно его состояние, например логгер и стандартные потоки ввода вывода, у них есть состояние, но как правило, приложению фиолетово, что выводили в лог или в поток минуту назад. 
Сам подумай, передавать в каждый объект указатель на std::cout или %loggername% - глупо.

А если я делаю структуру с обьектами класса конфигурации, а так же с обьектом класса, который пишет лог и указатель на экземпляр этой структуры у меня передается в другие модули приложения? так тоже глупо?
хочу совет
PM MAIL   Вверх
Lazin
Дата 5.8.2009, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(GoldFinch @  5.8.2009,  10:29 Найти цитируемый пост)
Lazin, std::cout  - не синглтон. это обычная глобальная переменная. и это часть стандартной библиотеки
cout можно рассматривать как singletone, вообще, я имел ввиду стандартные потоки ввода вывода в общем

Цитата(GoldFinch @  5.8.2009,  10:29 Найти цитируемый пост)
у std::cout есть состояние, оно изменяется манипуляторами и флагами.

да, но если не пользоваться манипуляторами(или правильно ими пользоваться), то иногда можно считать что его нет smile 
PM MAIL Skype GTalk   Вверх
Earnest
Дата 5.8.2009, 12:23 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Что за странная постановка вопроса? Даже GOTO не является безусловным злом. "Все есть яд и все есть лекарство". Просто голову нужно применять почаще.
Насчет приложения. Допустим, у меня есть куча объектов типа логгер (т.е. ровно один инстанс на сесссию). Какой-нибудь менеджер событий, очередь чего-нибудь глобальная, регистраторы разные, да мало ли. И что, по вашей логике, я их все из объекта-пртложения должна получать? И во что тогда объект-приложение превратиться? При том, что информация о как минимум половине этих объектов ему нафиг не нужна для нормальной жизни. Наоборот, преимущество синглетона в том, что он ни от кого не зависит и гарантирует единственность. Более того, семантика синглетона прекрасно расширяется на более сложные случаи, например, один экземпляр в потоке, или один экземпляр в документе, причем ни поток ни документ совершенно не должны знать об этих конкретных объектах. Т.е. это прекрасное средство для устранения лишних зависимостей.

Так что я синглетоны люблю. Но пользоваться ими надо не бездумно. Как и всем остальным, впрочем.



--------------------
...
PM   Вверх
azesmcar
Дата 5.8.2009, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Earnest

Полностью согласен. 
Злом считаю не синглтон, а антипатерн "Золотой молот", когда человек изучив синглтон пытается его внедрить во все мыслимые и немыслимые щели.
PM   Вверх
GoldFinch
Дата 5.8.2009, 12:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Цитата(Earnest @  5.8.2009,  13:23 Найти цитируемый пост)
Т.е. это прекрасное средство для устранения лишних зависимостей.

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

если объекту не надо с чем-то взаимодействовать - то он не должен об этом знать, а если надо - это должно быть написано в интерфейсе объекта

Добавлено через 13 минут и 52 секунды
Цитата(Earnest @  5.8.2009,  13:23 Найти цитируемый пост)
Какой-нибудь менеджер событий, очередь чего-нибудь глобальная, регистраторы разные, да мало ли. И что, по вашей логике, я их все из объекта-пртложения должна получать? 

по моей логике должно быть
queue = new SomeQueue();
eventMan = new EventManager(queue);

если логгер не имеет состояния, то он вобщем-то и не объект, 
(у объекта есть внутреннее состояние, которое изменяется вызовом его методов)
и то как организован доступ к этому логгеру - через глобальную переменную, глобальную функцию или еще как - не важно.
для "объекта" без состояния нет разницы между
Logger log; ... log.write(...);
или
Logger::Instance().write(...);
или
Logger_write(...);

Это сообщение отредактировал(а) GoldFinch - 5.8.2009, 12:37
PM MAIL ICQ   Вверх
mes
Дата 5.8.2009, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Earnest @  5.8.2009,  11:23 Найти цитируемый пост)
Более того, семантика синглетона прекрасно расширяется на более сложные случаи, например, один экземпляр в потоке, или один экземпляр в документе, 


Earnest, в понятие паттерна синглетон входит случай лишь когда класс объекта,  сам регулирует единичное кол-во своих инстанций 
или когда некто внешний регулирует кол-во инстанций равным в нашем случае единице ?


Это сообщение отредактировал(а) mes - 5.8.2009, 12:55


--------------------
PM MAIL WWW   Вверх
Earnest
Дата 6.8.2009, 06:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



mes, я и не имею в виду, что описанные расширения продолжают быть синглетоном. И потом, каноническое описание паттернов - это что евангелие новое? Смысл паттернов в том, чтобы дать пример логической организации кода и побудить к творчеству. smile 
Цитата(GoldFinch @  5.8.2009,  13:33 Найти цитируемый пост)
по моей логике должно быть
queue = new SomeQueue();

А где гарантия того, что каждый второй клиент не начнет создавать свои очереди? Синглетон же гарантирует единственность. А что касается зависимостей - ты не прав. Нет там никакой зависимости на уровне реализации, во всяком случае можно так сделать. И вот это высказывание
Цитата(GoldFinch @  5.8.2009,  13:33 Найти цитируемый пост)
если объекту не надо с чем-то взаимодействовать - то он не должен об этом знать, а если надо - это должно быть написано в интерфейсе объекта

более чем спорно. Для одного интерфейса может быть несколько реализаций: одни с зависимостями, другие без...
Кроме того, зависимости можно приблизительно учитывать как "прямого видение" определения класса \интерфейса \ функции. Так что когда зависимости только в реализации - их безусловно меньше.



--------------------
...
PM   Вверх
Любитель
Дата 6.8.2009, 07:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Ну вот взять тот же логгер. Допустим у нас есть реальный Logger, с записью куда-нибудь и отсылкой нотификейшенов на e-mail и есть FakeLogger - для тестов. Работаем с логгером мы только через ILogger. Синглетон в чистом виде - явно не пойдёт. Нужна какая-то фабрика логгеров. Она же управляет временем жизни. И вообще созданием подобных объектов должны управлять DI-фреймворки smile Синглетон - это костыль. Но зачастую приемлемый. Всему своё место и место каждой вещи под солнцем smile


--------------------
PM MAIL ICQ Skype   Вверх
Lazin
Дата 6.8.2009, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



ох уж эти enterprise программисты smile 
PM MAIL Skype GTalk   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0640 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.