Разделения на MVC недостаточно
С каждым днем iOS приложения становятся все более громоздкими, в следствие чего одного MVC становится мало.
Мы видим все больше и больше классов различного назначения: логика выносится в сервисы, модели оборачиваются декораторами, крупные представления разбиваются на более мелкие части. И самое главное, что в этом случае у нас появляется масса зависимостей, и мы должны ими как-то управлять.
Очень часто для решения проблемы зависимостей используется Singleton, по сути глобальная переменная, к которой все имеют доступ.
Как часто вам приходилось видеть подобный код?
[[RequestManager sharedInstance] loadResourcesAtPath:@"http://example.com/resources" withDelegate:self];
// или
[[DatabaseManager sharedManager] saveResource:resource];
Этот подход используется во множестве проектов, но он имеет некоторые недостатки:
- тяжело застабать синглтон который используется внутри тестируемого класса
- синглтон, по сути, глобальная переменная
- с точки зрения SRP объект не должен контролировать свое Singleton'овское поведение
Первую проблему решить довольно просто — нужно использовать свойства:
@interface ViewController : UIViewController
@property (nonatomic, strong) RequestManager *requestManager;
@end
Но этот подход имеет другие минусы — теперь кто-то должен «заполнить» это свойство.
Магия Крови способствует решению этой проблемы.
Читать полностью »