Синглетоны
May. 19th, 2014 09:42 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
https://github.com/SparkViewEngine/spark/blob/master/src/Samples/DirectUsage/ConsoleTemplating/Services/MessageBuilder.cs
А вот насколько подобный код (статик _instance и его инициализация) является кошерным? Ну с interlocked все более-менее понятно, а вот собственно использование синглетонов вместо всяких модных IoC и тому подобного усложняющего все трэша?
А вот насколько подобный код (статик _instance и его инициализация) является кошерным? Ну с interlocked все более-менее понятно, а вот собственно использование синглетонов вместо всяких модных IoC и тому подобного усложняющего все трэша?
no subject
Date: 2014-05-19 07:05 pm (UTC)no subject
Date: 2014-05-19 07:21 pm (UTC)public readonly MessageBuilder Instance = new DefaultMessageBuilder()
Гарантируется отсутствие проблем с многопоточностью. Там могут быть проблемы в каких-нибудь мудреных случаях - типа проинициализируется оно раньше чем нужно если позвали статический метод, которому instance не нужен.
Но всё это волнует это только молодежь, которым важно лиду показать "смотри, я дабл-лок умею! Читал умную книжку недавно". Я лично пишу в одну строчку, и мне пофигу.
По поводу IoC и прочих фабрик - оно хорошо только там где оно точно надо. Потому что фабрика, которая может создавать более одного вида инстансов - она сразу, например, делает предельно сложным понимание без дебаггера что откуда вызывается. Типа go to definition делаешь - а там интерфейс или абстрактный класс. А учитывая как жидко в ООП текут абстракции тупых ООП-шников, ихний пустой интерфейс как-то не греет душу.
Я лично прошел как минимум один диалектический цикл - раньше использовал IoC без фанатизма, теперь же предпочитаю хардкодить всё до упора, включая даже большинство настроек. Проще максимально упростить деплой компилированного кода, чем менять в бою разлапистый XML со встроеными убогими eDLS-ями.
no subject
Date: 2014-05-19 07:28 pm (UTC)В общем я не могу придумать когда может потребоваться дабл-лок вручную.
no subject
Date: 2014-05-21 02:12 pm (UTC)no subject
Date: 2014-05-21 02:22 pm (UTC)no subject
Date: 2014-05-21 02:50 pm (UTC)no subject
Date: 2014-05-23 04:02 pm (UTC)The static field variable initializers of a class correspond to a sequence of assignments that are executed in the textual order in which they appear in the class declaration. .…
10.12 Static constructors
…It is possible to construct circular dependencies that allow static fields with variable initializers to be observed in their default value state.…
Выделение жирным моё.
no subject
Date: 2014-05-19 07:30 pm (UTC)Но это не возражение, там, мелочная заметка.
no subject
Date: 2014-05-19 07:40 pm (UTC)По-факту, конечно, IoC с фабриками юзают подрастающие ООП-шники - просто для красоты. Типа вместо 2+2 - херакс, и пять классов с интерфейсами и XML-комментариями. И вроде работы много сделал, и выглядит умно, и законодательно говнокодом назвать нельзя - ведь так делать завещали GoF, Фаулер, и прочие фашисты. Сказать что они неправы - это пойти против enterprise-религии.
Для тестов еще бывает применяют - хотя для тестов можно mock-ать реализации и другими средствами, с меньшим количеством букв и файликов.
no subject
Date: 2014-05-19 08:29 pm (UTC)no subject
Date: 2014-05-19 07:36 pm (UTC)no subject
Date: 2014-05-19 07:56 pm (UTC)no subject
Date: 2014-05-23 08:08 pm (UTC)no subject
Date: 2014-05-19 07:22 pm (UTC)no subject
Date: 2014-05-19 07:27 pm (UTC)no subject
Date: 2014-05-19 07:37 pm (UTC)no subject
Date: 2014-05-19 07:38 pm (UTC)no subject
Date: 2014-05-19 07:50 pm (UTC)no subject
Date: 2014-05-19 07:41 pm (UTC)class A
{
private static A _instance = new A();
}
no subject
Date: 2014-05-19 07:41 pm (UTC)no subject
Date: 2014-05-19 07:45 pm (UTC)no subject
Date: 2014-05-19 08:01 pm (UTC)А так, лично я не фанат синглтонов, из-за их глобальной видимости и их "синглтоновости". :) Сколько ими не пользовался, всегда наступал момент, когда приходилось создавать несколько объектов, вместо 1 - после этого, приходилось переделывать их в нормальные классы и это лишь улучшало общий дезайн.
no subject
Date: 2014-05-19 08:05 pm (UTC)Хотя, если для полиморфного использования... - но это уже для продвинутых извращенцев. :)
no subject
Date: 2014-05-20 02:41 pm (UTC)no subject
Date: 2014-05-20 03:24 pm (UTC)no subject
Date: 2014-05-20 05:10 pm (UTC)no subject
Date: 2014-05-20 06:07 pm (UTC)Я вспомнил несколько мест, где у нас такое может боком вылезти - например, если мы более одного веб-сервиса возжелаем сунуть в один процесс - у них окажутся общие ссылки на некоторые внутренние сервисы и это будет плохо.
no subject
Date: 2014-05-20 06:29 pm (UTC)no subject
Date: 2014-05-20 08:04 pm (UTC)Вообще говоря, должна теоретически быть возможность протащить свой логгер в каждую подсистему. Поэтому идея архитектурно одного логгера на все приложение тоже выглядит достойной заявкой на посадку на кол.
В целом, единственной причиной для существования синглтонов мне видится неготовность народа таскать состояние явно. В то же время сам факт допущения использования синглтонов неизбежно создает риск ситуаций, описанных ребе Метаклассом.
no subject
Date: 2014-05-20 08:35 pm (UTC)no subject
Date: 2014-05-20 08:42 pm (UTC)no subject
Date: 2014-05-20 08:49 pm (UTC)no subject
Date: 2014-05-20 08:53 pm (UTC)no subject
Date: 2014-05-20 08:51 pm (UTC)no subject
Date: 2014-05-20 08:53 pm (UTC)no subject
Date: 2014-05-20 08:54 pm (UTC)И что будет ключом в том и ином случае?
no subject
Date: 2014-05-20 08:59 pm (UTC)Меня этот вариант тащемта напрягает адом паттернов, написанием классов ради того чтобы писать классы.
no subject
Date: 2014-05-20 09:03 pm (UTC)no subject
Date: 2014-05-20 09:00 pm (UTC)Но это, понятное дело, разговоры в пользу бедных, поскольку какая инфраструктура сложилась, с такой и придется жить. XML-парсер, например, свой писать никому не хочется.