Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

Сергей Крапивенский

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

  • Inicia sesión para ver los comentarios

Сергей Крапивенский

  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 Отображает полученные от Presenter данные Информирует Presenter о действиях пользователя
  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 categories (Core Data) restaurantId restaurant (Core Data) restaurant (PONSO) categories (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

×