juan_gandhi: (Default)
[personal profile] juan_gandhi
Как-то я не врубался во вред синглтонов - пока не пришлось рефакторить одну и ту же апликацию, разнесённую по двум платформам методом копи-пейста. Всякая собака ссылается на синглтон. Будто нельзя в параметрах получить (di, т.е.)

Так я о чём? Да вот: синглтон класса - это примерно как поименованная общая область. Вот вам имя, вот вам инстанс, и делайте вы с этим что хотите.

Тьфу.

Так что осознал, да. Синглтоны не то что зло, а большая глупость, имеющая причиной отсутствие дизайна. Десяток синглтонов - и вот вам помойка. В добавок к которой возникает священное знание: чтобы сделать то-то и то-то, надо взять три таких-то синглтона (и передать их друг другу, во).
(deleted comment)

Date: 2010-02-11 02:02 am (UTC)
From: [identity profile] qehgt.livejournal.com
Ленивая инициализация и синглтон - это ж разные вещи.

Разговор о том, что синглтоны добавляют неявных зависимостей между модулями, что в дальнейшем мешает развитию/использованию. К примеру, через синглтон реализован интерфейс logger'а ("а, что, удобно, из любого места можно можно информацию вывести"). Позже, когда разным модулям требуется выводить свой лог в _разные_ места, выясняется, что сделать это в нынешнем виде невозможно.

А передавали бы интерфейс -- проблемы бы и не возникло.
(deleted comment)

Date: 2010-02-11 02:24 am (UTC)
From: [identity profile] sab123.livejournal.com
Алиментарно обеспечить. Иметь явный кэширующий контекст.

Date: 2010-02-11 02:38 am (UTC)
From: [identity profile] itman.livejournal.com
http://ivan-ghandhi.livejournal.com/1237032.html?thread=11119400#t11119400
Вообще, кеширующий контекст - это какие-то странные слова. Но важно-то тут то, что описанною мною ситуация, это не совсем инициализация. Инициализация происходит раньше. То есть объект существует априори в единственном числе.

Date: 2010-02-11 03:34 am (UTC)
From: [identity profile] itman.livejournal.com
Зря я все-таки потер. Все-таки, это получается синглтон. Можно считать, что есть функция
GetFileOpenIfClose(int FileNumber)
В парадигме синглтона, это решается заведение синглтона на каждый файл. Код инициализации синглотона также открывает файл. И можно в двух словах объяснить, как кеширующий контекст поможет заменить синглтон?

Date: 2010-02-11 02:28 pm (UTC)
From: [identity profile] sab123.livejournal.com
Объект будет существовать не в глобальном виде а как часть другого явно передаваемого объекта. То есть, да, синглтон, но внутри своего пространства имен.

Что такое контекст - читать тут http://members.verizon.net/~babkin/tpopp/05exit.txt , в конце страницы.

Date: 2010-02-11 03:30 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Гуд пойнт насчёт особой проблемы с синглтонами в многопоточных программах. Поди найди концы - и, соответственно, решение держать контекст гораздо более осмыслено.

Date: 2010-02-11 03:53 pm (UTC)
From: [identity profile] itman.livejournal.com
Это фабрика, ИМХО. Но внутри все равно должны быть синглтона. От них не убежать. Главное, это избавиться от вызов getInstance там, где от него можно избавиться.

Date: 2010-02-12 01:27 am (UTC)
From: [identity profile] sab123.livejournal.com
Нет-нет. Фабрика каждый раз создает новый объект, используя запомненные параметры для конструктора.

Контекст же типа мешка. Вначале кто-то создает всякие полезные объекты и кладет их в мешок. После чего ссылка на этот мешок передается везде где нужно, и когда этим прочим местам что-то нужно, они находят готовый объект в этом мешке. Таким образом глобальные переменные оказываются не совсем глобальными, а только в пределах мешка (т.е. контекста).

Date: 2010-02-11 03:37 am (UTC)
From: [identity profile] itman.livejournal.com
Зря я все-таки потер. Все-таки, это получается синглтон. Можно считать, что есть функция
GetFileOpenIfClose(int FileNumber)
В парадигме синглтона, это решается заведение синглтона на каждый файл. Код инициализации синглотона также открывает файл. И можно в двух словах объяснить, как передача интерфейса поможет заменить синглтон? Или Вы имеете в виду интерфейс в смысле COM-объектов? Но так ведь там все равно возникает проблема однократной инициализации объекта. Чем это не синглтон.

Date: 2010-02-11 04:13 am (UTC)
From: [identity profile] qehgt.livejournal.com
>как передача интерфейса поможет заменить синглтон?
Было:
void MyClass::foo()
{
   ... bla-bla
   OurCoolUtils::Logger::getInstance()->write("Finish bla");
   ... boo-boo
}

Стало:
MyClass::MyClass(........, ILogger* logger) 
  : .... logger(logger)
{
  ...
}

void MyClass::foo()
{
   ... bla-bla
   logger->write("Finish bla");
   ... boo-boo
}

Date: 2010-02-11 04:16 am (UTC)
From: [identity profile] qehgt.livejournal.com
В реальных программах, конечно, передаваётся ссылка или используется smart pointer.

Всё для того же - сэкономить время в будущем.

Date: 2010-02-11 05:03 am (UTC)
From: [identity profile] itman.livejournal.com
А, я понял. Вы не хотите, чтобы в коде везде был getInstance(). Это ИМХО очень правильный подход :-)
Но все равно придется написать:
MyClass SomeVar(...,OutCoolUtils::Logger::getInstance())

Или инициализировать OutCoolUtils::Logger глобально.

Date: 2010-02-11 05:08 am (UTC)
From: [identity profile] itman.livejournal.com
Только я, возможно, забыл сказать, что в вышеприведенной задачке нельзя инициализировать объект глобально. Потому что инициализации и переинициализация наступает уже после старта программы.

Profile

juan_gandhi: (Default)
Juan-Carlos Gandhi

May 2025

S M T W T F S
    1 2 3
456 7 8 9 10
11 121314151617
181920 21 222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 24th, 2025 12:38 pm
Powered by Dreamwidth Studios