Pull to refresh

Comments 20

UFO just landed and posted this here

Классно! Но не хватает какой нибудь навигации.

Да. Полностью с вами согласен. Не хватает навигации. Вот только я не нашёл в редакторе статьи таких элементов, как ссылки и оглавление. Но скорее всего должно быть что-то подобное.

Авторская реализация 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 гарантирует, что инициализация любого статического поля гарантированно произойдет до его использования и произойдет не более одного раза.

И где это написано в документах на среду?
В среде определен лишь порядок в котором будет происходить инициализация при первом обращении к классу:

  1. статические поля в порядке объявления

  2. статические конструктор, если есть.

Таким образом, если первым статическим полем сделать экземпляр самого класса, то в самом начале вызовется конструктор экземпляра, ещё до статического конструктора и во время инициализации этого поля.

ПС. Если в примера автора статьи конструктор World создаст объект, который в конструкторе попытается получить доступ к World, то произойдет упс.

Так я и думал, что упрощенная версия Одиночки никому не понравится. По-хорошему бы часть паттернов переписать.

Нууу.. зря вы в этой статье ищете "правильные" реализации. Статья вроде про паттерны, которые служат для того чтобы показать отношения и взаимодействия между классами или объектами.

Первые 2 паттерна имеют удачные и понятные примеры (листы бумаги и элементы майнкрафта), а потом... увы...

"Фабричный метод" как раз ужасно описан. Просто, даже, ошибочно. У автора, на самом деле, вместо "фабричного метода" получилась та же самая "абстрактная фабрика", только в вырожденном варианте - не с несколькими методами создания Create***, а с одним.

Да остальные-то тоже... так себе. Flyweight тупо описан неверно, ну или скажем неполно, что лишает его основного смысла.

Первоначально и была идея взять что-то специфичное. Но начало пусть будет стандартное.

Добавьте пжл оглавление с названиями категорий и паттернов

Sign up to leave a comment.

Articles