2016-08-20 02 Антон Ковалев, Антон Кормаков. viper. Чистая...

41
VIPER Чистая архитектура для iOS

Upload: -

Post on 13-Apr-2017

152 views

Category:

Education


3 download

TRANSCRIPT

Page 1: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

VIPERЧистая архитектура для iOS

Page 2: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Знакомство с VIPER

● Доклад и обсуждения на MBLTDev’15

● Конференция Rambler.iOS V

● Различные статьи и видео

2

Page 3: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

MVC

3

VIEW

CONTROLLER

MODEL

User action

Update Notify

Update

Page 4: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Cocoa MVC

4

VIEW

UIView

CONTROLLER

UIViewControllerMODEL

Update

Notify

Page 5: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Минусы

● В контроллерах смешивается бизнес-логика и UI

● MVC == Massive View Controllers

● Глобальные стейты и переменные

● Контроллеры тяжело тестировать

Cocoa MVC

5

Page 6: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

SOLID

S - Single responsibility principle (Принцип единственной ответственности)

O - Open/closed principle (Принцип открытости/закрытости)

L - Liskov substitution principle (Принцип подстановки Барбары Лисков)

I - Interface segregation principle (Принцип разделения интерфейса)

D - Dependency inversion principle (Принцип инверсии зависимостей)

6

Page 7: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

VIPER

7

ROUTER

VIEW PRESENTER

E

E

INTERACTOR

Page 8: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

● Четкое распределение ролей внутри модуля

● Легкая расширяемость и поддержка

● Тестируемость

● Избавление от Massive View Controllers

Что обещает VIPER?

8

Page 9: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

VIPER от Rambler

9

ASSEMBLY

ROUTER

VIEW PRESENTER INTERACTOR

SERVICE

SERVICE

SERVICE

E

E

Page 10: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

VIEW

● Пассивна

● Отвечает только за передачу событий в PRESENTER

10

ASSEMBLY

ROUTER

VIEW PRESENTER INTERACTOR

SERVICE

SERVICE

SERVICE

E

E

Page 11: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

INTERACTOR

● Бизнес-логика

11

ASSEMBLY

ROUTER

VIEW PRESENTER INTERACTOR

SERVICE

SERVICE

SERVICE

E

E

Page 12: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

PRESENTER

● Сердце модуля

12

ASSEMBLY

ROUTER

VIEW PRESENTER INTERACTOR

SERVICE

SERVICE

SERVICE

E

E

Page 13: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

ROUTER

● Переходы

13

ASSEMBLY

ROUTER

VIEW PRESENTER INTERACTOR

SERVICE

SERVICE

SERVICE

E

E

Page 14: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

ASSEMBLY

● Сборщик модуля

● Typhoon

14

ASSEMBLY

ROUTER

VIEW PRESENTER INTERACTOR

SERVICE

SERVICE

SERVICE

E

E

Page 15: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

SERVICE

● Бизнес-логика

● INTERACTOR превращается в фасад над сервисами

15

ASSEMBLY

ROUTER

VIEW PRESENTER INTERACTOR

SERVICE

SERVICE

SERVICE

E

E

Page 16: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

VIPER на практике

16

Page 17: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

О приложении

● Новости

● Объявления

● События

● Профили пользователей

и многое другое…

Практически все экраны приложения – таблица

Практически все экраны отображают данные, полученные с сервера

17

Page 18: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Типовой модуль

ASSEMBLY

<ViewOutput> <InteractorInput>

<RouterInput>

<Service>

UIViewController

UIView, UIControl

ФабрикиUI-компонентов

Фабрики view model

Состояние модуля

Фабрики сабмодулей

Обработка событий от View

Обновление View

Взаимодействие с сервисами

<ModuleInput> <ModuleOutput>

Сетевые запросы

Данные сессии

Информация о текущем пользователе

Настройки приложения

VIEW PRESENTER INTERACTOR

ROUTER

<ViewInput> <InteractorOutput> SERVICE

18

Page 19: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Работа типового модуляНачальная загрузка

objectsobjects

Presenter InteractorView

19

viewDidLoad

displayData:

didTriggerReadyEvent

didFetchData:

fetchData

Page 20: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Работа типового модуляПодгрузка данных

objectsobjects

Presenter InteractorView

20

onInfiniteScroll:

appendData:

didTriggerInfiniteScrollEvent:

didFetchNextData:

fetchNextData

Page 21: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Работа типового модуляОбработка внешних событий

objectsobjects

Presenter InteractorView

21

prependData: didReceiveData: didReceivePushNotification:

Page 22: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Сервисы и их зависимости

● Single responsibility

● Взаимодейтвие через протоколы

● Dependency Injection (Typhoon)

22

FeedService

FeedBlocksFactoryRequestCreator

SessionStorage

AppConfiguration

Page 23: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Переходы

objects

Feed Router Transition HandlerFeed Presenter

23

prependData: showJobContentWithObject:

openModule:

configureWithObject:

id

Module Input

objects

Job Presenter (Module Input)

Page 24: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Разбиение на модули

24

Navigation module

Tabbar module

Feed module

Jobs module

Page 25: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Разбиение на модули

25

Carousel module

People module

Page 26: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Взаимодействие с сабмодулями

26

ASSEMBLY

<ViewOutput> <InteractorInput>

<RouterInput>

<ModuleInput> <ModuleOutput>

VIEW PRESENTER INTERACTOR

ROUTER

<ViewInput> <InteractorOutput>

VIEWPRESENTER<ViewOutput>

<ViewInput>

<Input><Output>

Main Module

Submodule

Page 27: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Взаимодействие с сабмодулями

objects

Jobs moduleFeed module

27

Fetch content

Instantiate modules

Prepare sections

Display sections

configureModule

sectionItemWithObject:view model

Insert cells ‘SHOW MORE’ tapIndex path

Page 28: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

● Переиспользование сабмодулей

● Общая логика

● Общие элементы

● Однотипное представление

Контент экраны

28

Page 29: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Базовый модуль

29

Base View Base Presenter Base Interactor

Base Router

Service1

Service2

Job View

Job Assembly

Job Presenter Job Interactor

Job Router

Service3

Page 30: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Итоги

30

Page 31: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Первые впечатления

● ААА! Сложна!

● Очень много связей

● Assembly(Typhoon) == Магия

● Это overkill

31

Page 32: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Если разобраться

● Все абсолютно прозрачно

● Все связи логичные

● Assembly(Typhoon) == Фреймворк

32

Page 33: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Merge

● Xcode не умеет безболезненно добавлять файлы в проект

● Огромное число конфликтов

● Merge мог занимать около 40 минут

33

Page 34: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

xUnique

● Скрипт на python

● Встраивается в проект как post-build action

● В разы уменьшает количество конфликтов

Минусы

● После работы скрипта теряется текущая навигация проекта

● Если вызвать несколько раз одновременно - поломает проект

34

Page 35: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Кодогенератор

Generamba

● Рутинные тесты создаются сразу

● Легко создавать свои шаблоны

● Гибкость внутри шаблонов

● Отзывчивость разработчиков

35

Page 36: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Адаптация к изменяющимся требованиям

36

Page 37: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Адаптация к изменяющимся требованиям

3737

Page 38: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Адаптация к изменяющимся требованиям

● Новый модуль для свайпа контента

● Подготовка старых контент модулей к отображению в новом

● Всю логику получения и кеширования контента переместили в

новый сервис

38

Page 39: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Тестирование

● Взаимодействие внутри модуля

● Взаимодействие между модулями

● Взаимодействие модулей с сервисами

● Сервисы

39

Page 40: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Итог

● Проект поделен на модули

● Бизнес-логика отделена от UI

● Проект легко покрывается тестами

● Предсказуемость поведения

● VIPER сочетается с scrum

40

Page 41: 2016-08-20 02 Антон Ковалев, Антон Кормаков. Viper. Чистая архитектура для iOS

Вопросы?

41