Comments 20
Классно! Но не хватает какой нибудь навигации.
Авторская реализация singleton это настоящий шедевр - нигде раньше такого не видел.
Да, смешно. Ты ему где-нибуть в коде чуть позже World.GetInstance("Твой мир", 2), а он тебе фигвам: "Мой мир" 1.
Еще прикольно, что "одному и тому же объекту может обратиться сразу несколько процессов поэтому в его реализации должна быть соответствующая блокировка" и... и никаой блокировки, ни классического lock ни чуть более модного Lazy.
ни классического lock ни чуть более модного Lazy.
В .NET можно даже вообще обойтись статическим полем - его инициализация и "ленивая" и "потокобезопасная" (Lazy
, правда, дает дополнительные возможности для обработки возможных ошибок при инициализации). И, еще, в любом случае, при использовании DI всё это не только лишнее, но и вредное.
"ленивая" и "потокобезопасная"
И не гарантированная. Вот программист удивится когда там будет null.
Нет, тут вы заблуждаетесь. .NET CLR гарантирует, что инициализация любого статического поля гарантированно произойдет до его использования и произойдет не более одного раза. Могут быть некоторые нюансы с "ленивостью" (наличие или отсутствие статического конструктора и флага beforefieldinit
, причем это поведение еще и менялось когда-то с переходом на очередную версию .NET). Косяки с инициализацией статики могут быть когда инициализация одного статического поля зависит от другого статического поля, потому что в этом случае инициализатор первого может быть вызван раньше инициализатора второго.
Нет, это вы заблуждаетесь, фраза "не более одного раза " в документации CLR и у Рихтера должна была вам намекнуть, что - 0 раз это всё еще "не более одного раза". Если бы там была гарантия "ровно один раз", толгда бы и можно было сказать что поле "будет" инициировано. А так любое поле до может сделать лок и зависнуть в нем - опа и 0 раз, Mono, к примеру повесит секунд 30, а потом скажет "похуй" и оставит поле в null а тред инициализации зависшим.
Второй кейс это Exception в во время инициализации этого или другого поля.
Если бы там была гарантия "ровно один раз", толгда бы и можно было сказать что поле "будет" инициировано.
Ну, я же еще написал:
инициализация любого статического поля гарантированно произойдет до его использования
А вот это да, верно (о чем я тоже выше писал):
Второй кейс это Exception в во время инициализации этого или другого поля.
.NET CLR гарантирует, что инициализация любого статического поля гарантированно произойдет до его использования и произойдет не более одного раза.
И где это написано в документах на среду?
В среде определен лишь порядок в котором будет происходить инициализация при первом обращении к классу:
статические поля в порядке объявления
статические конструктор, если есть.
Таким образом, если первым статическим полем сделать экземпляр самого класса, то в самом начале вызовется конструктор экземпляра, ещё до статического конструктора и во время инициализации этого поля.
ПС. Если в примера автора статьи конструктор World создаст объект, который в конструкторе попытается получить доступ к World, то произойдет упс.
Так я и думал, что упрощенная версия Одиночки никому не понравится. По-хорошему бы часть паттернов переписать.
Нууу.. зря вы в этой статье ищете "правильные" реализации. Статья вроде про паттерны, которые служат для того чтобы показать отношения и взаимодействия между классами или объектами.
Первые 2 паттерна имеют удачные и понятные примеры (листы бумаги и элементы майнкрафта), а потом... увы...
"Фабричный метод" как раз ужасно описан. Просто, даже, ошибочно. У автора, на самом деле, вместо "фабричного метода" получилась та же самая "абстрактная фабрика", только в вырожденном варианте - не с несколькими методами создания Create***
, а с одним.
А зачем вот это всё писать, эту информацию можно найти везде?
На хабре тоже была статья https://habr.com/ru/articles/191934/
Хорошо паттерны описаны тут https://metanit.com/sharp/patterns/
Нужно что-то специфичное.
Пока все по GoF.
Добавьте пжл оглавление с названиями категорий и паттернов
Сто паттернов для разработки корпоративных программ. Часть первая