metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2014-05-19 09:42 pm

Синглетоны

https://github.com/SparkViewEngine/spark/blob/master/src/Samples/DirectUsage/ConsoleTemplating/Services/MessageBuilder.cs

А вот насколько подобный код (статик _instance и его инициализация) является кошерным? Ну с interlocked все более-менее понятно, а вот собственно использование синглетонов вместо всяких модных IoC и тому подобного усложняющего все трэша?

[identity profile] vp.livejournal.com 2014-05-19 07:05 pm (UTC)(link)
Красивый код.

[identity profile] jakobz.livejournal.com 2014-05-19 07:21 pm (UTC)(link)
Это какой-то вариант синглтона с дабл-локом - который весьма распространен, видимо с явы какой-нибудь скопирован. Многие не шарят что в дотнете можно делать тупо так:

public readonly MessageBuilder Instance = new DefaultMessageBuilder()

Гарантируется отсутствие проблем с многопоточностью. Там могут быть проблемы в каких-нибудь мудреных случаях - типа проинициализируется оно раньше чем нужно если позвали статический метод, которому instance не нужен.

Но всё это волнует это только молодежь, которым важно лиду показать "смотри, я дабл-лок умею! Читал умную книжку недавно". Я лично пишу в одну строчку, и мне пофигу.

По поводу IoC и прочих фабрик - оно хорошо только там где оно точно надо. Потому что фабрика, которая может создавать более одного вида инстансов - она сразу, например, делает предельно сложным понимание без дебаггера что откуда вызывается. Типа go to definition делаешь - а там интерфейс или абстрактный класс. А учитывая как жидко в ООП текут абстракции тупых ООП-шников, ихний пустой интерфейс как-то не греет душу.

Я лично прошел как минимум один диалектический цикл - раньше использовал IoC без фанатизма, теперь же предпочитаю хардкодить всё до упора, включая даже большинство настроек. Проще максимально упростить деплой компилированного кода, чем менять в бою разлапистый XML со встроеными убогими eDLS-ями.

[identity profile] blackyblack.livejournal.com 2014-05-19 07:22 pm (UTC)(link)
Такой код очень распространён. По сути это обычный сишный модуль: разово инициализируемый и глобально доступный.

[identity profile] mr-st.livejournal.com 2014-05-19 07:27 pm (UTC)(link)
Интерлокед там нафиг не нужен, кстати.

[identity profile] max630.livejournal.com 2014-05-19 07:41 pm (UTC)(link)
зачем конкретно вот это вообще виртуализовать?

[identity profile] max630.livejournal.com 2014-05-19 07:45 pm (UTC)(link)
А по теме - если, там есть именно public set {}, а не internal, с проковырянной дырочкой специально для юниттестов - подозреваю какую-то херню, которую можно было бы с трешем сделать

[identity profile] maxdz.livejournal.com 2014-05-19 08:01 pm (UTC)(link)
Не очень ясно, почему в коде по ссылке должен быть синглтон, если у него нет внутреннего состояния. Достаточно было сделать 1 статическую функцию "трансформ".

А так, лично я не фанат синглтонов, из-за их глобальной видимости и их "синглтоновости". :) Сколько ими не пользовался, всегда наступал момент, когда приходилось создавать несколько объектов, вместо 1 - после этого, приходилось переделывать их в нормальные классы и это лишь улучшало общий дезайн.

[identity profile] permea-kra.livejournal.com 2014-05-20 02:41 pm (UTC)(link)
А за синглетоны как явление еще не принято сажать на кол?