SlideShare a Scribd company logo
1 of 20
Download to read offline
Как мы стали писать
бизнес-логику
Сапрыкин Г.А.
Руководитель отдела 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

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

QA MeetUp - Алексей Чумагин: "Тестирование в Big Data"
QA MeetUp - Алексей Чумагин: "Тестирование в Big Data"QA MeetUp - Алексей Чумагин: "Тестирование в Big Data"
QA MeetUp - Алексей Чумагин: "Тестирование в Big Data"
Provectus
 
Rich-client, или Как я перестал боятся и полюбил велосипеды / Владимир Дупелев
Rich-client, или Как я перестал боятся и полюбил велосипеды / Владимир ДупелевRich-client, или Как я перестал боятся и полюбил велосипеды / Владимир Дупелев
Rich-client, или Как я перестал боятся и полюбил велосипеды / Владимир Дупелев
Ontico
 
Роман Кокин «Организация тестирования в больших командах»
Роман Кокин «Организация тестирования в больших командах»Роман Кокин «Организация тестирования в больших командах»
Роман Кокин «Организация тестирования в больших командах»
DataArt
 

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

Great functional testing with WebDriver and Thucydides
Great functional testing with WebDriver and ThucydidesGreat functional testing with WebDriver and Thucydides
Great functional testing with WebDriver and Thucydides
 
QA MeetUp - Алексей Чумагин: "Тестирование в Big Data"
QA MeetUp - Алексей Чумагин: "Тестирование в Big Data"QA MeetUp - Алексей Чумагин: "Тестирование в Big Data"
QA MeetUp - Алексей Чумагин: "Тестирование в Big Data"
 
AUG-1
AUG-1AUG-1
AUG-1
 
Java Presentation.pptx
Java Presentation.pptxJava Presentation.pptx
Java Presentation.pptx
 
Rich-client, или Как я перестал боятся и полюбил велосипеды / Владимир Дупелев
Rich-client, или Как я перестал боятся и полюбил велосипеды / Владимир ДупелевRich-client, или Как я перестал боятся и полюбил велосипеды / Владимир Дупелев
Rich-client, или Как я перестал боятся и полюбил велосипеды / Владимир Дупелев
 
Система управления жизненным циклом разработки программного обеспечения Devpr...
Система управления жизненным циклом разработки программного обеспечения Devpr...Система управления жизненным циклом разработки программного обеспечения Devpr...
Система управления жизненным циклом разработки программного обеспечения Devpr...
 
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
 
Роман Кокин «Организация тестирования в больших командах»
Роман Кокин «Организация тестирования в больших командах»Роман Кокин «Организация тестирования в больших командах»
Роман Кокин «Организация тестирования в больших командах»
 
CQRS. Event Sourcing. Особенности тестирования
CQRS. Event Sourcing. Особенности тестированияCQRS. Event Sourcing. Особенности тестирования
CQRS. Event Sourcing. Особенности тестирования
 
Cовременные подходы организации процессов разработки
Cовременные подходы организации процессов разработкиCовременные подходы организации процессов разработки
Cовременные подходы организации процессов разработки
 
Планирование развития автотестов, Кирилл Раткин, СКБ Контур
 Планирование развития автотестов, Кирилл Раткин, СКБ Контур  Планирование развития автотестов, Кирилл Раткин, СКБ Контур
Планирование развития автотестов, Кирилл Раткин, СКБ Контур
 
Что, зачем и каким образом следует проверять и тестировать перед запуском сай...
Что, зачем и каким образом следует проверять и тестировать перед запуском сай...Что, зачем и каким образом следует проверять и тестировать перед запуском сай...
Что, зачем и каким образом следует проверять и тестировать перед запуском сай...
 
Behavior Driven Development
Behavior Driven DevelopmentBehavior Driven Development
Behavior Driven Development
 
Tuning HighLoad J2EE web application
Tuning HighLoad J2EE web applicationTuning HighLoad J2EE web application
Tuning HighLoad J2EE web application
 
Web application testing architecture
Web application testing architectureWeb application testing architecture
Web application testing architecture
 
Dev & test на windows azure
Dev & test на windows azureDev & test на windows azure
Dev & test на windows azure
 
Андрей Фейгин. GTM Словами агентства.
Андрей Фейгин. GTM Словами агентства.Андрей Фейгин. GTM Словами агентства.
Андрей Фейгин. GTM Словами агентства.
 
Организация процесса ручного тестирования
Организация процесса ручного тестированияОрганизация процесса ручного тестирования
Организация процесса ручного тестирования
 
Архитектура автоматизированных тестов: представление предметной области
Архитектура автоматизированных тестов: представление предметной областиАрхитектура автоматизированных тестов: представление предметной области
Архитектура автоматизированных тестов: представление предметной области
 
2016-01-16 02 Екатерина Боброва. Архитектура автоматизированных тестов
2016-01-16 02 Екатерина Боброва. Архитектура автоматизированных тестов2016-01-16 02 Екатерина Боброва. Архитектура автоматизированных тестов
2016-01-16 02 Екатерина Боброва. Архитектура автоматизированных тестов
 

More from RAMBLER&Co

More from RAMBLER&Co (20)

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

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