![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Как-то я не врубался во вред синглтонов - пока не пришлось рефакторить одну и ту же апликацию, разнесённую по двум платформам методом копи-пейста. Всякая собака ссылается на синглтон. Будто нельзя в параметрах получить (di, т.е.)
Так я о чём? Да вот: синглтон класса - это примерно как поименованная общая область. Вот вам имя, вот вам инстанс, и делайте вы с этим что хотите.
Тьфу.
Так что осознал, да. Синглтоны не то что зло, а большая глупость, имеющая причиной отсутствие дизайна. Десяток синглтонов - и вот вам помойка. В добавок к которой возникает священное знание: чтобы сделать то-то и то-то, надо взять три таких-то синглтона (и передать их друг другу, во).
Так я о чём? Да вот: синглтон класса - это примерно как поименованная общая область. Вот вам имя, вот вам инстанс, и делайте вы с этим что хотите.
Тьфу.
Так что осознал, да. Синглтоны не то что зло, а большая глупость, имеющая причиной отсутствие дизайна. Десяток синглтонов - и вот вам помойка. В добавок к которой возникает священное знание: чтобы сделать то-то и то-то, надо взять три таких-то синглтона (и передать их друг другу, во).
no subject
Date: 2010-02-11 02:02 am (UTC)Разговор о том, что синглтоны добавляют неявных зависимостей между модулями, что в дальнейшем мешает развитию/использованию. К примеру, через синглтон реализован интерфейс logger'а ("а, что, удобно, из любого места можно можно информацию вывести"). Позже, когда разным модулям требуется выводить свой лог в _разные_ места, выясняется, что сделать это в нынешнем виде невозможно.
А передавали бы интерфейс -- проблемы бы и не возникло.
no subject
Date: 2010-02-11 02:24 am (UTC)no subject
Date: 2010-02-11 02:38 am (UTC)Вообще, кеширующий контекст - это какие-то странные слова. Но важно-то тут то, что описанною мною ситуация, это не совсем инициализация. Инициализация происходит раньше. То есть объект существует априори в единственном числе.
no subject
Date: 2010-02-11 03:34 am (UTC)GetFileOpenIfClose(int FileNumber)
В парадигме синглтона, это решается заведение синглтона на каждый файл. Код инициализации синглотона также открывает файл. И можно в двух словах объяснить, как кеширующий контекст поможет заменить синглтон?
no subject
Date: 2010-02-11 02:28 pm (UTC)Что такое контекст - читать тут http://members.verizon.net/~babkin/tpopp/05exit.txt , в конце страницы.
no subject
Date: 2010-02-11 03:30 pm (UTC)no subject
Date: 2010-02-11 03:53 pm (UTC)no subject
Date: 2010-02-12 01:27 am (UTC)Контекст же типа мешка. Вначале кто-то создает всякие полезные объекты и кладет их в мешок. После чего ссылка на этот мешок передается везде где нужно, и когда этим прочим местам что-то нужно, они находят готовый объект в этом мешке. Таким образом глобальные переменные оказываются не совсем глобальными, а только в пределах мешка (т.е. контекста).
no subject
Date: 2010-02-11 03:37 am (UTC)GetFileOpenIfClose(int FileNumber)
В парадигме синглтона, это решается заведение синглтона на каждый файл. Код инициализации синглотона также открывает файл. И можно в двух словах объяснить, как передача интерфейса поможет заменить синглтон? Или Вы имеете в виду интерфейс в смысле COM-объектов? Но так ведь там все равно возникает проблема однократной инициализации объекта. Чем это не синглтон.
no subject
Date: 2010-02-11 04:13 am (UTC)Было:
Стало:
no subject
Date: 2010-02-11 04:16 am (UTC)Всё для того же - сэкономить время в будущем.
no subject
Date: 2010-02-11 05:03 am (UTC)Но все равно придется написать:
Или инициализировать OutCoolUtils::Logger глобально.
no subject
Date: 2010-02-11 05:08 am (UTC)