В чем преимущества VIPER с координатором по сравнению с классическим MVC
Что проверяют
Видите ли вы, какие конкретные проблемы Apple MVC решает связка VIPER и координатора и какой ценой. Следом обычно спрашивают, чем Router отличается от координатора и зачем нужны оба.
Как отвечать
Начните с проблемы. В Apple MVC UIViewController совмещает View и Controller: вёрстку, жизненный цикл, сеть, форматирование и навигацию. Отсюда Massive View Controller и жёсткая связность: экран сам создаёт следующий и вызывает pushViewController или performSegue, поэтому знает о соседях и их зависимостях.
Что даёт VIPER:
- разделение ролей: логика в Interactor, подготовка данных к показу в Presenter, контроллер остаётся тонким;
- тестируемость: слои связаны протоколами, Presenter и Interactor тестируются без UIKit;
- параллельная работа: границы модулей явные, разработчики реже конфликтуют в одном файле.
Что добавляет координатор. Router собирает модуль и показывает его, а координатор управляет потоком между модулями: онбординг, авторизация, оформление заказа. Модуль сообщает наружу «пользователь выбрал товар» через делегат или замыкание, а куда идти дальше, решает координатор. Выигрыш:
- переиспользование: один экран встраивается в разные сценарии без правок;
- диплинки и пуши: маршрутизация собрана в одном месте, а не размазана по контроллерам;
- смена флоу: поменять порядок экранов значит поправить координатор, а не несколько контроллеров.
Цена: пять или шесть файлов на экран, протоколы, генераторы шаблонов и долгий вход для новичка. На небольшом приложении MVC с вынесенной логикой или MVVM часто выгоднее.
Где спотыкаются
Дублируют навигацию: и Router, и координатор решают, куда идти, и через полгода никто не знает, где искать переход.
Ловят утечки: дочерние координаторы хранятся в массиве childCoordinators и не удаляются после завершения флоу.
Забывают про системный жест «назад»: UINavigationController снимает экран сам, в обход координатора. Нужен UINavigationControllerDelegate, который отследит возврат и почистит состояние.