Yet another architectur. Как устроены приложения SuperJob изнутри

39
Yet another architecture Как устроены приложения SuperJob изнутри Токарев Сергей, старший IOS-разработчик [email protected]

Transcript of Yet another architectur. Как устроены приложения SuperJob изнутри

Yet another architecture Как устроены приложения SuperJob изнутри

Токарев Сергей, старший IOS-разработчик [email protected]

Приложения SuperJob

Поиск работы Superjob

Superjob HR: поиск сотрудников

Производственный календарь

[ObjC] [Swift]

2445

2446

2447

2448

}

@end

return cell;

!

Цель

Модульная структура Тесты

MVC

VIP

MVVM

VIPER

View

delegate

ReactiveCocoa

ReactiveCocoa

Facade

ViewModel

Adapter

Objection

Objectionhttp://objection-framework.org

//инициализация objection- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { JSObjectionInjector *injector = [JSObjection createInjector]; [JSObjection setDefaultInjector:injector];}

Objection в действии@interface Facade ()@property (nonatomic, strong) APIAdapter *apiAdapter;@end

@implementation Facadeobjection_requires(@"apiAdapter")

Секция 1

Секция 2

Facade

ViewModel

Adapter

View

Adapter

Получение данных из источника ФайлБДAPI

Adapter

Получение данных из источника ФайлБДAPI

Приведение ошибок к NSError Серверные валидацииАвторизация и т.д.

Авторизован/ получаем через api

ApiAdapter

Не авторизован/ хранятся локально

Авторизован/ получаем через api

FileAdapterApiAdapter

интерфейс Adaptertypedef NS_ENUM(NSUInteger, APIAdapterSubscriptionsErrorCode) { APIAdapterSubscriptionsErrorCodeAuthorization, APIAdapterSubscriptionsErrorCodeDelete,};

@interface APIAdapter

/** Список подписок

@param @[@"count" : @10] @return RACTuple<NSArray <NSDictionary *>*rawData, NSNumber *count> */- (RACSignal *)subscriptionsListWithParams:(NSDictionary *)params;

Facade

ViewModel

Adapter

View

FacadeВыбор источника данных

Пользователь авторизован

FileAdapter ApiAdapter

FacadeВыбор источника данных

Преобразование полученных данных из адаптера в модели

Пользователь авторизован

FileAdapter

json subscribtionsModel

ApiAdapter

интерфейс Facade@interface Facade

** Список подписок

@param @[@"count" : @10] @return RACTuple<NSArray<SubscriptionModel *> *model, NSNumber *count> */- (RACSignal *)subscriptionsListWithType:(NSDictionary *)params;

Facade

ViewModel

Adapter

View

ViewModel

ViewModel

Формирует элементы для отображения в ячейке

ViewModel

Формирует элементы для отображения в ячейке

Формирует секции из элементов

ViewModel

Формирует элементы для отображения в ячейке

Формирует секции из элементов

Реализует бизнес-логику

Секция 1

Элементы

Секция 2

интерфейс ViewModel/**Количество секций@return количество секций*/- (NSUInteger)sectionsCount;**

Получить секцию по индексу@return sectionItem*/(id<TableViewSectionProtocol>)sectionAtIndex:(NSInteger)section;/** Элемент секции по индексу@return viewItem*/- (__kindof id<TableViewItem>)itemAtIndexPath:(NSIndexPath *)indexPath;

View

Facade

ViewModel

Adapter

Coverage

Используем

Используем

pod «Specta»

Используем

pod «Specta»

pod «Expecta»

Используем

pod «Specta»

pod «Expecta»

pod «OCMockito»

Что мы получили в итоге

• модульность;

Что мы получили в итоге

• модульность;

• тестируемость;

Что мы получили в итоге

• модульность;

• тестируемость;

• удобство разработки и понимания структуры;

Что мы получили в итоге

• модульность;

• тестируемость;

• удобство разработки и понимания структуры;

• возможность распараллелить работу разработчиков

Что мы получили в итоге

Спасибо! Вопросы?