Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Rosberry
August 20, 2016

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

В докладе рассказано о VIPER — архитектурном решении, разработанном специально для iOS. На примере реального коммерческого проекта показано как разбивать приложение на модули, как дробить модули на сабмодули и как перестать смешивать бизнес-логику и UI. Так же рассказано том, как VIPER помогает справиться с постоянно изменяющимися бизнес-требованиями и облегчает рефакторинг.

Rosberry

August 20, 2016
Tweet

More Decks by Rosberry

Other Decks in Programming

Transcript

  1. Знакомство с VIPER • Доклад и обсуждения на MBLTDev’15 •

    Конференция Rambler.iOS V • Различные статьи и видео 2
  2. Минусы • В контроллерах смешивается бизнес-логика и UI • MVC

    == Massive View Controllers • Глобальные стейты и переменные • Контроллеры тяжело тестировать Cocoa MVC 5
  3. SOLID S - Single responsibility principle (Принцип единственной ответственности) O

    - Open/closed principle (Принцип открытости/закрытости) L - Liskov substitution principle (Принцип подстановки Барбары Лисков) I - Interface segregation principle (Принцип разделения интерфейса) D - Dependency inversion principle (Принцип инверсии зависимостей) 6
  4. • Четкое распределение ролей внутри модуля • Легкая расширяемость и

    поддержка • Тестируемость • Избавление от Massive View Controllers Что обещает VIPER? 8
  5. VIEW • Пассивна • Отвечает только за передачу событий в

    PRESENTER 10 ASSEMBLY ROUTER VIEW PRESENTER INTERACTOR SERVICE SERVICE SERVICE E E
  6. ASSEMBLY • Сборщик модуля • Typhoon 14 ASSEMBLY ROUTER VIEW

    PRESENTER INTERACTOR SERVICE SERVICE SERVICE E E
  7. О приложении • Новости • Объявления • События • Профили

    пользователей и многое другое… Практически все экраны приложения – таблица Практически все экраны отображают данные, полученные с сервера 17
  8. Типовой модуль ASSEMBLY <ViewOutput> <InteractorInput> <RouterInput> <Service> UIViewController UIView, UIControl

    ФабрикиUI-компонентов Фабрики view model Состояние модуля Фабрики сабмодулей Обработка событий от View Обновление View Взаимодействие с сервисами <ModuleInput> <ModuleOutput> Сетевые запросы Данные сессии Информация о текущем пользователе Настройки приложения VIEW PRESENTER INTERACTOR ROUTER <ViewInput> <InteractorOutput> SERVICE 18
  9. Работа типового модуля Подгрузка данных objects objects Presenter Interactor View

    20 onInfiniteScroll: appendData: didTriggerInfiniteScrollEvent: didFetchNextData: fetchNextData
  10. Сервисы и их зависимости • Single responsibility • Взаимодейтвие через

    протоколы • Dependency Injection (Typhoon) 22 FeedService FeedBlocksFactory RequestCreator SessionStorage AppConfiguration
  11. Переходы objects Feed Router Transition Handler Feed Presenter 23 prependData:

    showJobContentWithObject: openModule: configureWithObject: id Module Input objects Job Presenter (Module Input)
  12. Взаимодействие с сабмодулями 26 ASSEMBLY <ViewOutput> <InteractorInput> <RouterInput> <ModuleInput> <ModuleOutput>

    VIEW PRESENTER INTERACTOR ROUTER <ViewInput> <InteractorOutput> VIEW PRESENTER <ViewOutput> <ViewInput> <Input> <Output> Main Module Submodule
  13. Взаимодействие с сабмодулями objects Jobs module Feed module 27 Fetch

    content Instantiate modules Prepare sections Display sections configureModule sectionItemWithObject: view model Insert cells ‘SHOW MORE’ tap Index path
  14. Базовый модуль 29 Base View Base Presenter Base Interactor Base

    Router Service1 Service2 Job View Job Assembly Job Presenter Job Interactor Job Router Service3
  15. Merge • Xcode не умеет безболезненно добавлять файлы в проект

    • Огромное число конфликтов • Merge мог занимать около 40 минут 33
  16. xUnique • Скрипт на python • Встраивается в проект как

    post-build action • В разы уменьшает количество конфликтов Минусы • После работы скрипта теряется текущая навигация проекта • Если вызвать несколько раз одновременно - поломает проект 34
  17. Кодогенератор Generamba • Рутинные тесты создаются сразу • Легко создавать

    свои шаблоны • Гибкость внутри шаблонов • Отзывчивость разработчиков 35
  18. Адаптация к изменяющимся требованиям • Новый модуль для свайпа контента

    • Подготовка старых контент модулей к отображению в новом • Всю логику получения и кеширования контента переместили в новый сервис 38
  19. Итог • Проект поделен на модули • Бизнес-логика отделена от

    UI • Проект легко покрывается тестами • Предсказуемость поведения • VIPER сочетается с scrum 40