Комментарии 33
Я думаю, что нужно это вопрос переадресовать Apple насчет UIApplication и NSUserDefaults. :)
Ну и с другой стороны есть у Вас база данных, что вы на каждый запрос свою копию sql порождаете?
от сюда могу сделать вывод, что антипатерны появились благодаря кривым ручкам, которые не научились ими пользоваться. Это как тушить пожар бензином на космической станции наполненной чистым кислородом.
Я вот сам ООП до конца не понимаю, и считаю что ООП это сплошной антипатерн в FP.
Хотя есть друзья которые умеют Scala и я на них смотрю с белой завистью.
Да ладно, идите объясните Дейкстре, что goto это нормально [1] и он просто не умеет его готовить, потом расскажите сэру Tony Hoare что null ссылки это ок [2], ну а под конец поведайте Erich Gamma и Ralph Johnson, что они заблуждаются называя синглтон своей ошибкой [3][4].
Время показало, что некоторые идеи, которые на первый взгляд кажутся нормальными, на самом деле вредны. Давайте уже перестанем их защищать, особенно, когда даже их авторы это уже признали.
[1] http://homepages.cwi.nl/~storm/teaching/reader/Dijkstra68.pdf
[2] https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare
[3] http://www.informit.com/articles/article.aspx?p=1404056
[4] https://twitter.com/daverooneyca/status/529799186795884544
Попытаюсь перефразировать. Инженер как и любой другой человек подвержен заблуждениям и предрассудокам из-за которых сложно трезво оценивать технологии. Если мы всю жизнь использовали goto, то нам сложно признать что это было ошибкой. Такой эффект известен в психологии как эскалация обязательств [1].
Вопрос в том, как замечать такое поведение и избегать его. Хороший подход — смотреть за авторами технологий и гигантами индустрии. Если изобртатель технологии смог перешагнуть через свою гордость и признать ошибку, то вероятно что-то дейсвительно с ней не так. Ссылки выше были как раз про это. Tony Hoare придумал null ссылки, Erich Gamma и Ralph Johnson — синглтоны.
Я согласен, что каждому инструменту — свое назначение, просто назначение некоторых инструментов — отправиться на свалку истории :)
Забавно что вы упоминули спутники, вот тут [2] пишут что там как раз используют наработки сэра Tony Hoare и наисвежайшие идеи, такие как TLA+. В общем, не держитесь за то, что уже доказало свою несостоятельность.
[1] https://en.wikipedia.org/wiki/Escalation_of_commitment
[2] http://www.altreonic.com/content/main-mission-rosettas-philae-lander-accomplished
Статику сложнее тестировать, поэтому синглтон в этом плане лучше.
Поэтому СервисЛокатор лучше таки делать синглтоном.
Если приложение небольшое, у нас буквально один или два класса-одиночки. Городить DI особо смысла нет. Ну или нужна пачка одиночек в рамках отдельной подкомпоненты, и не хочется их держать в общем стеке. Тут тоже можно или пачку одиночек, или отдельный сервисЛокатор. По ситуации.
Так то я соглашусь что в реальном проекте оно нужно не часто, но это же классика.
У меня лично синглтон один — СервисЛокатор).
В первом комментарии уточнили уже насчет alloc-а. :)
Кстати, ещё есть allocWithZone, например, который и я не запретил.
Для Psionic хочу заметить только то, что паттерны используются не для того чтобы что-то уж совсем так перекрыть со всех сторон, а просто для того, чтобы другой разработчик понимал что же тут было задумано. Если ему хочется головной боли, то пусть лезет в рантайм, но описание класса как синглтона должно дать понять разработчику-пользователю библиотеки, что автор библиотеки не предполагал создания нескольких объектов, и не стоит потом ему предъявлять претензии. Образно говоря: автор библиотеки пистолет поставил на предохранитель, но пользователь может снять с предохранителя и всё же отстрелить себе мешающую ногу. :)
И я не придумал лучшего способа, чем взять книгу «Паттерны проектирования» Эрика и Элизабет Фримен, и написать примеры каждого паттерна на Objective-C и Swift.
Плохая идея. Паттерны, это не про реализацию набора правил, это про применение этого набора правил в подходящем для этого месте. Хотя, может и нужно пройти такого рода эволюцию:
1) паттерн головного мозга — это когда только прочитал про них и везде, чаще не к месту, применяешь их;
2) просветление — это когда реально познал дзен и можешь аргументированно рассказать почему в этом месте нужен именно этот паттерн, а при немного других вводных при той же функциональности уже нет.
Ну и да, антипаттерн — это не про тот или иной конкретный паттерн, а про неправельное его применение.
private(set) empty = true
private(set) boiled = false
// И getter'ы убрать
По'swift'ее будет вроде как.
class MyClass: {
static let shared = MyClass()
}
На всякий случай повторю концовку поста. :)
// Swift
class Singleton {
static let shared = Singleton()
private init() {}
}
private init()
, забыл «маленькую» деталь.А почему не вставить в тело поста короткий код? Почему только в конце?
@property (assign, nonatomic, getter=isEmpty) BOOL empty;
@property (assign, nonatomic, getter=isBoiled) BOOL boiled;
и тогда не нужно реализовывать гетеры
Паттерны проектирования, взгляд iOS разработчика. Часть 0. Синглтон-Одиночка