Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Чистая архитектура
с VIPER
Сергей Крапивенский, ведущий iOS-разработчик
Rambler&Co
Грязная архитектура
2
Грязная архитектура
• Огромные классы с кучей ответственностей
• Сильная связанность компонентов
• Трудно дебажить
• Трудн...
Чистая архитектура
• Простые компоненты с четкими обязанностями
• Слабая связанность
• Легко покрывается тестами
• Легко в...
MVC от Apple: ожидание
5
MVC от Apple: реальность
6
MVC от Apple
7
Как появился VIPER
8
08.2012 12.2013 06.2014 05.20152014-2015
Как появился VIPER
9
08.2012 12.2013 06.2014 05.20152014-2015
Как появился VIPER
10
08.2012 12.2013 06.2014 05.20152014-2015
Как появился VIPER
11
08.2012 12.2013 06.2014 05.20152014-2015
Как появился VIPER
12
08.2012 12.2013 06.2014 05.20152014-2015
Идея VIPER
• Приложение разбивается на блоки с однотипной структурой
• Принцип разбиения — по user story
• User story опис...
User story
Пример — лента фото в Instagram
Задача — отобразить последние фото
друзей
При необходимости можно перейти на
др...
User story
Список лайков к нашим фото — другая
история
Это простые примеры: 1 экран = 1 история
15
User story
На одном экране может быть несколько
разных историй
16
User story
На одном экране может быть несколько
разных историй
1. Лента фотографий
17
1. Лента фотографий
2. Таб-бар для п...
User story
На одном экране может быть несколько
разных историй
1. Лента фотографий
2. Таб-бар для переключения ленты
18
1....
User story
На одном экране может быть несколько
разных историй
1. Лента фотографий
2. Таб-бар для переключения ленты
3. Па...
Действия модуля
• Получает данные
• Преобразовывает данные для отображения
• Реагирует на действия пользователя
• Переходи...
Канонический модуль VIPER
E
PRESENTERVIEW INTERACTOR
WIREFRAME
E
21
E
PRESENTERVIEW INTERACTOR
WIREFRAME
E
22
Канонический модуль VIPER
Отображает на экране полученные данные
Информирует мод...
E
PRESENTERVIEW INTERACTOR
WIREFRAME
E
23
Канонический модуль VIPER
Содержит всю логику работы с данными
E
PRESENTERVIEW INTERACTOR
WIREFRAME
E
24
Канонический модуль VIPER
Подготавливает данные для отображения View
Обрабатывае...
E
PRESENTERVIEW INTERACTOR
WIREFRAME
E
25
Канонический модуль VIPER
Отвечает за навигацию модуля
Инициализирует модуль и и...
E
PRESENTERVIEW INTERACTOR
WIREFRAME
E
26
Канонический модуль VIPER
Простые модельные объекты
Не содержат никакой логики
Что мы изменили?
• Разделили Wireframe
• Добавили слой сервисов
• Сделали View слоем
• Формализовали переходы между модуля...
Разделили Wireframe
• Wireframe не удовлетворяет SRP
• Wireframe = Router + Assembly
• Router отвечает за навигацию
• Asse...
Добавили слой сервисов
• “Вся бизнес логика” звучит страшно 😱
• Сервисы — слой ниже интерактора
• 1 сервис = 1 тип сущност...
Слой View
• Тяжелое наследие UIViewController
• Работа с коллекциями не должна быть во View
• Layout и анимации можно выне...
Переходы между модулями
• То, о чем никто не говорит 🙊
• У каждого модуля есть <ModuleInput> и <ModuleOutput>
• Эти проток...
Кодогенерация
• С VIPER нужно создать кучу классов
• Каркас всех модулей однотипен
• Руками создавать долго и сложно
• Про...
Что у нас получилось
33
Что у нас получилось
34
Афиша.Рестораны
Категории
ресторанов
Рестораны в
категории
Экран
ресторана
35
Афиша.Рестораны
36
VIEW
Категории
ресторанов
STORYBOARD
segue
VIEW
Рестораны в
категории
instantiate
37
VIEW
Категории
ресторанов
STORYBOARD
segue
VIEW
Рестораны в
категории
instantiate
ASSEMBLY
build
38
VIEW
Категории
ресторанов
segue
VIEW
Рестораны в
категории
INTERACTOR
PRESENTER ROUTER
SERVICE
39
VIEW
Рестораны в
категории
INTERACTOR
PRESENTER ROUTER
SERVICE
VIEW
Экран
ресторана
INTERACTOR
PRESENTERROUTER
SERVICE
cat...
Чистая архитектура
• Простые компоненты с четкими обязанностями
• Слабая связанность
• Легко покрывается тестами
• Легко п...
Чистая архитектура
• Простые компоненты с четкими обязанностями
• Слабая связанность
• Легко покрывается тестами
• Легко п...
Чистая архитектура
• Простые компоненты с четкими обязанностями
• Слабая связанность
• Легко покрывается тестами
• Легко п...
Чистая архитектура
• Простые компоненты с четкими обязанностями
• Слабая связанность
• Легко покрывается тестами
• Легко п...
Чистая архитектура
• Простые компоненты с четкими обязанностями
• Слабая связанность
• Легко покрывается тестами
• Легко п...
Чистая архитектура
• Простые компоненты с четкими обязанностями
• Слабая связанность
• Легко покрывается тестами
• Легко п...
Rambler 😍 VIPER
• Рамблер.Конференции — open-source приложение
• Generamba — кодогенератор
• VIPER McFlurry — набор полезн...
Спасибо!
serkrapiv
sergey.krapivenskiy
rambler-ios
Upcoming SlideShare
Loading in …5
×

Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)

634 views

Published on

- Что такое "чистая" архитектура приложений. Чем грозит "грязная" архитектура, чем от нее отличается "чистая" архитектура, и какой от нее профит.
- История появления VIPER.
- Идея VIPER. Как изменяется структура приложения при применении этого подхода.
- Опыт использования VIPER в Rambler&Co. Что мы изменили и добавили.
- Работа с VIPER на примере user story из реального приложения.
- Выводы: чем помогает VIPER и когда его использовать не стоит.

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

Чистая архитектура с VIPER / Сергей Крапивенский (Rambler&Co)

  1. 1. Чистая архитектура с VIPER Сергей Крапивенский, ведущий iOS-разработчик Rambler&Co
  2. 2. Грязная архитектура 2
  3. 3. Грязная архитектура • Огромные классы с кучей ответственностей • Сильная связанность компонентов • Трудно дебажить • Трудно вносить изменения • Невозможно покрыть тестами • Хочется все сжечь 🔥 3
  4. 4. Чистая архитектура • Простые компоненты с четкими обязанностями • Слабая связанность • Легко покрывается тестами • Легко вносить изменения • Просто понять 4
  5. 5. MVC от Apple: ожидание 5
  6. 6. MVC от Apple: реальность 6
  7. 7. MVC от Apple 7
  8. 8. Как появился VIPER 8 08.2012 12.2013 06.2014 05.20152014-2015
  9. 9. Как появился VIPER 9 08.2012 12.2013 06.2014 05.20152014-2015
  10. 10. Как появился VIPER 10 08.2012 12.2013 06.2014 05.20152014-2015
  11. 11. Как появился VIPER 11 08.2012 12.2013 06.2014 05.20152014-2015
  12. 12. Как появился VIPER 12 08.2012 12.2013 06.2014 05.20152014-2015
  13. 13. Идея VIPER • Приложение разбивается на блоки с однотипной структурой • Принцип разбиения — по user story • User story описывает поведение приложения 13
  14. 14. User story Пример — лента фото в Instagram Задача — отобразить последние фото друзей При необходимости можно перейти на другие истории 14
  15. 15. User story Список лайков к нашим фото — другая история Это простые примеры: 1 экран = 1 история 15
  16. 16. User story На одном экране может быть несколько разных историй 16
  17. 17. User story На одном экране может быть несколько разных историй 1. Лента фотографий 17 1. Лента фотографий 2. Таб-бар для переключения ленты 3. Панель с информацией о пользователе
  18. 18. User story На одном экране может быть несколько разных историй 1. Лента фотографий 2. Таб-бар для переключения ленты 18 1. Лента фотографий 2. Таб-бар для переключения ленты 3. Панель с информацией о пользователе
  19. 19. User story На одном экране может быть несколько разных историй 1. Лента фотографий 2. Таб-бар для переключения ленты 3. Панель с информацией о пользователе 19
  20. 20. Действия модуля • Получает данные • Преобразовывает данные для отображения • Реагирует на действия пользователя • Переходит на другие модули при необходимости 20
  21. 21. Канонический модуль VIPER E PRESENTERVIEW INTERACTOR WIREFRAME E 21
  22. 22. E PRESENTERVIEW INTERACTOR WIREFRAME E 22 Канонический модуль VIPER Отображает на экране полученные данные Информирует модуль о действиях пользователя
  23. 23. E PRESENTERVIEW INTERACTOR WIREFRAME E 23 Канонический модуль VIPER Содержит всю логику работы с данными
  24. 24. E PRESENTERVIEW INTERACTOR WIREFRAME E 24 Канонический модуль VIPER Подготавливает данные для отображения View Обрабатывает действия пользователя
  25. 25. E PRESENTERVIEW INTERACTOR WIREFRAME E 25 Канонический модуль VIPER Отвечает за навигацию модуля Инициализирует модуль и инжектирует зависимости
  26. 26. E PRESENTERVIEW INTERACTOR WIREFRAME E 26 Канонический модуль VIPER Простые модельные объекты Не содержат никакой логики
  27. 27. Что мы изменили? • Разделили Wireframe • Добавили слой сервисов • Сделали View слоем • Формализовали переходы между модулями • Написали тулзу для кодогенерации 27
  28. 28. Разделили Wireframe • Wireframe не удовлетворяет SRP • Wireframe = Router + Assembly • Router отвечает за навигацию • Assembly отвечает за сборку модуля • Dependency Injection с помощью Typhoon Framework • https://github.com/appsquickly/Typhoon 28
  29. 29. Добавили слой сервисов • “Вся бизнес логика” звучит страшно 😱 • Сервисы — слой ниже интерактора • 1 сервис = 1 тип сущностей (новости, сообщения, etc) • Сервисы можно переиспользовать в разных модулях • Сервисы зависят от объектов нижнего уровня 29
  30. 30. Слой View • Тяжелое наследие UIViewController • Работа с коллекциями не должна быть во View • Layout и анимации можно вынести из View • Эти задачи относятся к отображению данных • Так View превратился в слой 30
  31. 31. Переходы между модулями • То, о чем никто не говорит 🙊 • У каждого модуля есть <ModuleInput> и <ModuleOutput> • Эти протоколы реализует презентер • Пример: переход из модуля А в модуль B • Роутер модуля А передает данные в презентер модуля B • Презентер модуля B возвращает результат в презентер модуля А 31
  32. 32. Кодогенерация • С VIPER нужно создать кучу классов • Каркас всех модулей однотипен • Руками создавать долго и сложно • Программисту лень писать руками? Нужен скрипт • Generamba! • https://github.com/rambler-ios/Generamba 32
  33. 33. Что у нас получилось 33
  34. 34. Что у нас получилось 34
  35. 35. Афиша.Рестораны Категории ресторанов Рестораны в категории Экран ресторана 35
  36. 36. Афиша.Рестораны 36
  37. 37. VIEW Категории ресторанов STORYBOARD segue VIEW Рестораны в категории instantiate 37
  38. 38. VIEW Категории ресторанов STORYBOARD segue VIEW Рестораны в категории instantiate ASSEMBLY build 38
  39. 39. VIEW Категории ресторанов segue VIEW Рестораны в категории INTERACTOR PRESENTER ROUTER SERVICE 39
  40. 40. VIEW Рестораны в категории INTERACTOR PRESENTER ROUTER SERVICE VIEW Экран ресторана INTERACTOR PRESENTERROUTER SERVICE categoryId restaurants (Core Data) restaurantId restaurant (Core Data) restaurant (PONSO) restaurants (PONSO) 40
  41. 41. Чистая архитектура • Простые компоненты с четкими обязанностями • Слабая связанность • Легко покрывается тестами • Легко подвергается изменениям • Просто понять 41
  42. 42. Чистая архитектура • Простые компоненты с четкими обязанностями • Слабая связанность • Легко покрывается тестами • Легко подвергается изменениям • Просто понять 42
  43. 43. Чистая архитектура • Простые компоненты с четкими обязанностями • Слабая связанность • Легко покрывается тестами • Легко подвергается изменениям • Просто понять 43
  44. 44. Чистая архитектура • Простые компоненты с четкими обязанностями • Слабая связанность • Легко покрывается тестами • Легко подвергается изменениям • Просто понять 44
  45. 45. Чистая архитектура • Простые компоненты с четкими обязанностями • Слабая связанность • Легко покрывается тестами • Легко подвергается изменениям • Просто понять 45
  46. 46. Чистая архитектура • Простые компоненты с четкими обязанностями • Слабая связанность • Легко покрывается тестами • Легко подвергается изменениям • Просто понять 46
  47. 47. Rambler 😍 VIPER • Рамблер.Конференции — open-source приложение • Generamba — кодогенератор • VIPER McFlurry — набор полезных утилит • The Book Of VIPER — все, что мы знаем о VIPER • И еще некоторые плюшки • https://github.com/rambler-ios 47
  48. 48. Спасибо! serkrapiv sergey.krapivenskiy rambler-ios

×