SlideShare a Scribd company logo
Как мы стали писать
бизнес-логику
Сапрыкин Г.А.
Руководитель отдела iOS разработки @ Rambler&Co
План
• Определение
• Актуальность
• Текущее развитие
• Будущее
Что такое бизнес-логика
Все, что не относится к отображению
Актуальность
• Качество и скорость разработки
• Качество и скорость поддержки
• Командная разработка
Проблемы
Наследование
CustomTableViewController
Строк кода базового класса 1226
Свойств в базовом классе 44
Сабклассов 10
Строк в сабклассах 161...686
Наследование
• Композиция
self.tableViewDataSource = [CustomTableViewDataSource new];
self.tableView.dataSource = self.tableViewDataSource;
• Агрегация
[self.service findCustomDataWithText:text];
Синглтон
[GazetaAPIManager sharedManager]
Синглтон
• Усложнение тестирования кода
• Наличие глобального объекта
• God-object
Синглтон
• Усложнение тестирования кода
• Наличие глобального объекта
• God-object
Dependency Injection
Single responsibility principle
Сервисы
Service Layer
Domain Model
Data Source
Layer
UserInterfaces
Data
Loaders
Сервисы
• Правила написания логики
• Модульная архитектура
• Простота кода
• Тестируемость
Сервисы
- (void)synchronizeMessagesInFolder:(RCMFolder *)folder completionBlock:(RCMErrorBlock)block {
[self.client callMethod:kXMLRPCMethodGetFolderMessages
completionBlock:^(NSDictionary *response, RCMError *error) {
if (error) {
block(error);
return;
}
else {
RCMError *validationError = nil;
if ([self.validator validateServerResponse:response
error:&validationError]) {
[self mapResponse:response completionBlock:^{
block(nil);
}];
}else{
block(validationError);
}
}
}];
}
Сервисы
- (void)handlerMessagesInFolder:folderName block:block response:response error:error {
if (error) {
block(error);
return;
}
[self.validator validateServerResponse:response error:&validationError];
if (validationError){
block(validationError);
return;
}
[self.mapper mapServerResponse:response
mappingContext:context];
dispatch_async(dispatch_get_main_queue(), ^{
block(nil);
});
}
Сервисы
- (void)downloadMessagesInFolder:folderName offset:offset count:count completionBlock:block{
id<RCMDeserializer> deserializer = /* инициализация */
id<RCMCookie> cookie = /* инициализация */
NSDictionary *parameters = /* инициализация */
id<RCMMapper> mapper = /* инициализация */
RCMRPCNetworkOperation *operation = [[RCMRPCNetworkOperation alloc] initWithClient:self.client
configurator:self.configurator
deserializer:deserializer
validator:self.validator
mapper:mapper
methodName:RCMXMLRPCMethodGetFolderMessages
parameters:parameters
cookie:cookie
completionBlock:nil];
operation.completionBlock = /* инициализация */
[self.operationPool addReadOperation:operation];
}
Сервисы
DownloadMessagesOperation
Deserialize

Operation
Request

Operation
Validate

Operation
Map

Operation
Сервисы
• Правила написания логики
• Модульная архитектура
• Простота кода
• Тестируемость
Сервисы
• Громоздкие контроллеры
• Усложнение тестирования
контроллеров
• Отсутствие стандартизации
написания контроллеров
ViewController
Service
Service
VIPER
Interactor
Service
Service
PresenterView
Router
Спасибо

More Related Content

PPTX
Платформа в облаках. Windows Azure
Департамент Стратегических Технологий
 
PDF
Разработчик
Sergey Gavrilov
 
PDF
Qulix Systems | Автоматизация функционального тестирования
Qulix Systems
 
PDF
Тестирование web-приложений на базе технологий Ruby/Cucumber/Watir Webdriver
Alex Mikitenko
 
PPTX
Selenium 2 WebDriver + Selenide + Java с и без использования BDD, сравнительн...
COMAQA.BY
 
PDF
Ара Исраелян "Как ускорить разработку приложений"
IT Event
 
PPTX
Tizen for Wearable Development Gear2 Danilov
Kirill Danilov
 
PPTX
API плюс толстый клиент – новая парадигма веб-разработки? / Андрей Лебедев (Г...
Ontico
 
Платформа в облаках. Windows Azure
Департамент Стратегических Технологий
 
Разработчик
Sergey Gavrilov
 
Qulix Systems | Автоматизация функционального тестирования
Qulix Systems
 
Тестирование web-приложений на базе технологий Ruby/Cucumber/Watir Webdriver
Alex Mikitenko
 
Selenium 2 WebDriver + Selenide + Java с и без использования BDD, сравнительн...
COMAQA.BY
 
Ара Исраелян "Как ускорить разработку приложений"
IT Event
 
Tizen for Wearable Development Gear2 Danilov
Kirill Danilov
 
API плюс толстый клиент – новая парадигма веб-разработки? / Андрей Лебедев (Г...
Ontico
 

More from RAMBLER&Co (20)

PDF
RDSDataSource: Основы LLVM
RAMBLER&Co
 
PDF
Rambler.iOS #9: Анализируй это!
RAMBLER&Co
 
PDF
Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?
RAMBLER&Co
 
PDF
Rambler.iOS #9: Life with out of memory
RAMBLER&Co
 
PDF
RDSDataSource: Чистые тесты на Swift
RAMBLER&Co
 
PDF
RDSDataSource: OCLint
RAMBLER&Co
 
PDF
RDSDataSource: Построение UML диаграмм
RAMBLER&Co
 
PDF
RDSDataSource: App Thinning
RAMBLER&Co
 
PDF
RDSDataSource: Мастер-класс по Dip
RAMBLER&Co
 
PDF
RDSDataSource: YapDatabase
RAMBLER&Co
 
PDF
Rambler.iOS #8: Чистые unit-тесты
RAMBLER&Co
 
PDF
Rambler.iOS #8: Сервис-ориентированная архитектура
RAMBLER&Co
 
PDF
Rambler.iOS #8: Make your app extensible with JavaScriptCore
RAMBLER&Co
 
PDF
Rambler.iOS #8: Как не стать жертвой бэкендеров
RAMBLER&Co
 
PDF
RDSDataSource: iOS Reverse Engineering for inexperienced
RAMBLER&Co
 
PDF
RDSDataSource: Автогенерация документации для SDK
RAMBLER&Co
 
PDF
RDSDataSource: Плюрализация в iOS
RAMBLER&Co
 
PDF
RDSDataSource: Promises
RAMBLER&Co
 
PDF
RDSDataSource: Flux, Redux, ReSwift
RAMBLER&Co
 
PDF
Rambler.iOS #7: Построение сложного табличного интерфейса
RAMBLER&Co
 
RDSDataSource: Основы LLVM
RAMBLER&Co
 
Rambler.iOS #9: Анализируй это!
RAMBLER&Co
 
Rambler.iOS #9: Нужны ли бэкенд-разработчики, когда есть Swift?
RAMBLER&Co
 
Rambler.iOS #9: Life with out of memory
RAMBLER&Co
 
RDSDataSource: Чистые тесты на Swift
RAMBLER&Co
 
RDSDataSource: OCLint
RAMBLER&Co
 
RDSDataSource: Построение UML диаграмм
RAMBLER&Co
 
RDSDataSource: App Thinning
RAMBLER&Co
 
RDSDataSource: Мастер-класс по Dip
RAMBLER&Co
 
RDSDataSource: YapDatabase
RAMBLER&Co
 
Rambler.iOS #8: Чистые unit-тесты
RAMBLER&Co
 
Rambler.iOS #8: Сервис-ориентированная архитектура
RAMBLER&Co
 
Rambler.iOS #8: Make your app extensible with JavaScriptCore
RAMBLER&Co
 
Rambler.iOS #8: Как не стать жертвой бэкендеров
RAMBLER&Co
 
RDSDataSource: iOS Reverse Engineering for inexperienced
RAMBLER&Co
 
RDSDataSource: Автогенерация документации для SDK
RAMBLER&Co
 
RDSDataSource: Плюрализация в iOS
RAMBLER&Co
 
RDSDataSource: Promises
RAMBLER&Co
 
RDSDataSource: Flux, Redux, ReSwift
RAMBLER&Co
 
Rambler.iOS #7: Построение сложного табличного интерфейса
RAMBLER&Co
 
Ad

Rambler.iOS #4: Как мы стали писать бизнес-логику