Насколько "вредно" использование singleton?
От: Аноним  
Дата: 26.07.10 10:10
Оценка:
После того, как узнал про этот паттерн, постоянно хочется его применять . Кажется очень удобным иметь под рукой объект, в любом месте программы. То есть, и код структурируется по классам, и не нужно с передачей ссылок на объекты возиться. Но вот в "настоящих" ООП приложениях практически не встречаю его (обычно синглтоны — только объекты Application в различных фреймворках). До этого писал на С. Насколько "неправильной" для дизайна больших приложений может быть такая практика?
Re: Насколько "вредно" использование singleton?
От: jazzer Россия Skype: enerjazzer
Дата: 26.07.10 10:14
Оценка: 1 (1) +6 :))) :))
Здравствуйте, Аноним, Вы писали:

А>После того, как узнал про этот паттерн, постоянно хочется его применять . Кажется очень удобным иметь под рукой объект, в любом месте программы. То есть, и код структурируется по классам, и не нужно с передачей ссылок на объекты возиться. Но вот в "настоящих" ООП приложениях практически не встречаю его (обычно синглтоны — только объекты Application в различных фреймворках). До этого писал на С. Насколько "неправильной" для дизайна больших приложений может быть такая практика?


Практически всегда, когда я писал синглтон, наступал момент, когда мне нужно было два таких объекта.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Насколько "вредно" использование singleton?
От: Кодёнок  
Дата: 26.07.10 11:27
Оценка: 1 (1) -1
Здравствуйте, Аноним, Вы писали:

А>Но вот в "настоящих" ООП приложениях практически не встречаю его (обычно синглтоны — только объекты Application в различных фреймворках).


Синглтон не вреден или неправилен, он просто нахрен не нужен. И кстати application во многих фреймворках просто глобальная переменная, а не «умный» синглтон.
Re[2]: Насколько "вредно" использование singleton?
От: rm822 Россия  
Дата: 26.07.10 11:31
Оценка: 3 (1)
J>Практически всегда, когда я писал синглтон, наступал момент, когда мне нужно было два таких объекта.

для С++ больше подходит monostate
http://www.objectmentor.com/resources/articles/SingletonAndMonostate.pdf
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Насколько "вредно" использование singleton?
От: sidorov18 США  
Дата: 26.07.10 11:32
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Здравствуйте, Аноним, Вы писали:


А>>Но вот в "настоящих" ООП приложениях практически не встречаю его (обычно синглтоны — только объекты Application в различных фреймворках).


Кё>Синглтон не вреден или неправилен, он просто нахрен не нужен. И кстати application во многих фреймворках просто глобальная переменная, а не «умный» синглтон.


хм. нужен только один инстанс объекта на всю программу. какая альтернатива синглтону?
Re: Насколько "вредно" использование singleton?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 26.07.10 11:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>После того, как узнал про этот паттерн, постоянно хочется его применять . Кажется очень удобным иметь под рукой объект, в любом месте программы. То есть, и код структурируется по классам, и не нужно с передачей ссылок на объекты возиться. Но вот в "настоящих" ООП приложениях практически не встречаю его (обычно синглтоны — только объекты Application в различных фреймворках). До этого писал на С. Насколько "неправильной" для дизайна больших приложений может быть такая практика?


Синглтон это такая вещь, которая почти всегда используюется неправильно

Когда лень думать про инициализацию — берут синглтон
Лень думать про передачу ссылки — берут синглтон
Нужн только один инстанц — берут синглтон
Re[3]: Насколько "вредно" использование singleton?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 26.07.10 11:39
Оценка:
Здравствуйте, sidorov18, Вы писали:

Кё>>Синглтон не вреден или неправилен, он просто нахрен не нужен. И кстати application во многих фреймворках просто глобальная переменная, а не «умный» синглтон.


S>хм. нужен только один инстанс объекта на всю программу. какая альтернатива синглтону?


А по подробнее можно унать, что за класс объекта и почему только один инстанс ?
Re[4]: Насколько "вредно" использование singleton?
От: sidorov18 США  
Дата: 26.07.10 11:50
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, sidorov18, Вы писали:


Кё>>>Синглтон не вреден или неправилен, он просто нахрен не нужен. И кстати application во многих фреймворках просто глобальная переменная, а не «умный» синглтон.


S>>хм. нужен только один инстанс объекта на всю программу. какая альтернатива синглтону?


I>А по подробнее можно унать, что за класс объекта и почему только один инстанс ?


Я не топикстартер.
Я вообще

У меня, например, синглтоном класс лог.
А еще есть класс-синглтон, который контент из нета качает и парсит в свои структуры.
Re[2]: Насколько "вредно" использование singleton?
От: enji  
Дата: 26.07.10 11:52
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Синглтон не вреден или неправилен, он просто нахрен не нужен. И кстати application во многих фреймворках просто глобальная переменная, а не «умный» синглтон.


Ну так глобальная переменная — это и есть простейший вариант синглтона, нет?

А всякие обертки нужны чтобы разрулить порядок инициализации и время жизни...
Re: Насколько "вредно" использование singleton?
От: Guard_h4s Россия  
Дата: 26.07.10 12:11
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>После того, как узнал про этот паттерн, постоянно хочется его применять . Кажется очень удобным иметь под рукой объект, в любом месте программы. То есть, и код структурируется по классам, и не нужно с передачей ссылок на объекты возиться. Но вот в "настоящих" ООП приложениях практически не встречаю его (обычно синглтоны — только объекты Application в различных фреймворках). До этого писал на С. Насколько "неправильной" для дизайна больших приложений может быть такая практика?


Вообще, синглтон повышает связанность(coupling) вашего кода. Это не значит что это плохо, но иногда может мешать(например написанию юнит тестов)
Вносится дополнительное глобальное состояние всей программы. Однако удобства его использования чаще всего склоняют в сторону его использования (мы использовали в проекте где 1М строк кода) Здесь не рассматривается вариант "мы используем синглтон потому что лень следить/управлять временем жизни объекта". Как правило это именно централизованый доступ, а не управление временем жизни объекта(CreateInstance(), DestroyInstance() присутствуют всегда явно, или объект вообще создается на стеке) В случае с многопоточностью, как правило, это один объект на поток(что также неплохо ложится на TLS)
Re[3]: Насколько "вредно" использование singleton?
От: enji  
Дата: 26.07.10 12:30
Оценка:
Здравствуйте, rm822, Вы писали:

R>для С++ больше подходит monostate

R>http://www.objectmentor.com/resources/articles/SingletonAndMonostate.pdf

Почитал, не понял в чем преимущество monostate.

class TMonostate
{
  static std::string s;

public:

  const std::string& getS() { return s; }
  
};


В таком виде использовать не получится, так как до входа в main() TMonostate::s может быть неинициализирована. Т.е. внутри надо городить синглетон, оберткой для которого будет этот TMonostate. Тогда в чем преимущество?
Re[2]: Насколько "вредно" использование singleton?
От: Faust Россия  
Дата: 26.07.10 12:34
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Синглтон не вреден или неправилен, он просто нахрен не нужен.

не соглашусь... и поддержу sidorov18'а
Автор: sidorov18
Дата: 26.07.10
в его ссылке на практическую задачу о логгировании, которая особенно усугубляется в многопоточной среде, которая существенно усложняет реализацию singleton'а. другое дело, что использование этого паттерна должно быть осознанным и аргументированным, а также вязаться с программным интерфейсом приложения, которое в дальнейшем кто-то будет поддерживать...
Мой компьютер прогоняет бесконечный цикл за 9 секунд, но, мне кажется, он мог бы сделать это быстрее...
Re[4]: Насколько "вредно" использование singleton?
От: rm822 Россия  
Дата: 26.07.10 12:57
Оценка:
E>В таком виде использовать не получится, так как до входа в main() TMonostate::s может быть неинициализирована. Т.е. внутри надо городить синглетон, оберткой для которого будет этот TMonostate. Тогда в чем преимущество?
Преимущество будет когда выясниться что объектов нифига не один, и что закладываться на это везде в коде было большой ошибкой
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Насколько "вредно" использование singleton?
От: szag  
Дата: 26.07.10 13:20
Оценка: +2
Здравствуйте, sidorov18, Вы писали:

S>У меня, например, синглтоном класс лог.

S>А еще есть класс-синглтон, который контент из нета качает и парсит в свои структуры.

всегда может понадобится второй лог и работа через несколько соединений. Чисто моё имхо, в идеальной программе сингелтонов быть не должно. Практически всегда может потребоваться вторая копия объекта и исправить это будет не так просто, как изначально отказаться от использования синглтонов.
Re: Насколько "вредно" использование singleton?
От: minorlogic Украина  
Дата: 26.07.10 14:24
Оценка: 6 (1)
Здравствуйте, <Аноним>, Вы писали:

А>После того, как узнал про этот паттерн, постоянно хочется его применять . Кажется очень удобным иметь под рукой объект, в любом месте программы. То есть, и код структурируется по классам, и не нужно с передачей ссылок на объекты возиться. Но вот в "настоящих" ООП приложениях практически не встречаю его (обычно синглтоны — только объекты Application в различных фреймворках). До этого писал на С. Насколько "неправильной" для дизайна больших приложений может быть такая практика?


Вреден ровно настолько насколько глобальные данные.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[5]: Насколько "вредно" использование singleton?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 26.07.10 14:37
Оценка:
Здравствуйте, sidorov18, Вы писали:

S>Я не топикстартер.

S>Я вообще

S>У меня, например, синглтоном класс лог.


Лог это как раз пример того, что не должно быть синглтоном

S>А еще есть класс-синглтон, который контент из нета качает и парсит в свои структуры.


И это тоже
Re: Насколько "вредно" использование singleton?
От: kjam Украина  
Дата: 26.07.10 17:15
Оценка: 8 (2) +2
Я знаю только три случая когда класс можно делать синглтоном:

1. Состояние объекта не меняется на протяжении времени его жизни и это состояние можно полностью описать в программном коде/ресурсах — состояние не зависит от текущего времени, содержимого конфигурационных файлов, переменных окружения и т.п. Но синглтон вполне может грузить какие-либо ресурсы, которые считаются "вшитыми" в приложение. Т.е. синглтон является не глобальной переменной, а глобальной константой.

2. Синглтон является расширением рантайма, частью машины которая исполняет нашу программу. (Например — отладочное (!) логирование)

3. Синглтон используется для внедрения какого-либо хака. При этом надо четко осознавать что делается именно хак, и соответственным образом документировать эту ситуацию.

Во всех других случаях считаю использование синглтонов считаю неприемлемым.
Re[5]: Monostate
От: enji  
Дата: 26.07.10 17:18
Оценка:
Здравствуйте, rm822, Вы писали:

E>>В таком виде использовать не получится, так как до входа в main() TMonostate::s может быть неинициализирована. Т.е. внутри надо городить синглетон, оберткой для которого будет этот TMonostate. Тогда в чем преимущество?

R>Преимущество будет когда выясниться что объектов нифига не один, и что закладываться на это везде в коде было большой ошибкой

Ну т.е. monostate — это исключительно обертка над синглетоном. С тем же успехом можно возвращать из функции TSingleton::get() умный указатель. А если выяснится, что синглтон на самом деле не синглтон, то эта функция будет создавать объекты (возможно получая какие-то опциональные параметры), а не возвращать указатель на статический...
Re[2]: Насколько "вредно" использование singleton?
От: Centaur Россия  
Дата: 26.07.10 20:09
Оценка:
Здравствуйте, kjam, Вы писали:

K>2. Синглтон является расширением рантайма, частью машины которая исполняет нашу программу. (Например — отладочное (!) логирование)


Это сегодня программа однопоточная, и отладочное логирование можно сделать синглтоном. А завтра появится новый поток, и привет. Пользоваться из двух потоков одним отладочным логом без синхронизации — портить лог. Городить синхронизацию — а нафиг тогда потоки? Остаётся только делать по отдельному логу на каждый поток.
Re: Насколько "вредно" использование singleton?
От: Sni4ok  
Дата: 26.07.10 20:29
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>После того, как узнал про этот паттерн, постоянно хочется его применять


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