Использовали ли VIPER с координатором
Что проверяют
Понимаете ли вы, где в VIPER живёт навигация и как вынести её на уровень выше модуля. Интервьюеру важно, решали ли вы реальные проблемы связки: утечки дочерних координаторов, системную кнопку «Назад», диплинки. Следом обычно спрашивают, чем Router отличается от координатора и зачем тогда оба.
Как отвечать
Это вопрос про опыт, поэтому опирайтесь на свой проект. Каркас такой:
- разделение ролей: Router знает, как показать экран (
push,present), а координатор решает, какой экран показать следующим. Модуль перестаёт знать о соседях, и его можно переиспользовать в разных сценариях; - связь: модуль сообщает наружу о результате через протокол вывода или замыкание, например
didSelectItem(id). Presenter зовёт Router, Router передаёт событие координатору, координатор собирает следующий модуль через Assembly или Builder. Встречается и вариант, где координатор полностью заменяет Router, это нормально, если объясните выбор; - иерархия:
AppCoordinatorзапускает дочерние координаторы по флоу (авторизация, онбординг, основные вкладки), держит их в массивеchildCoordinatorsи удаляет, когда флоу закончен; - кнопка «Назад»: системный возврат обходит координатор. Решается через
UINavigationControllerDelegateиnavigationController(_:didShow:animated:), где проверяют, какой контроллер ушёл из стека; - диплинки: координаторы удобно разворачивают цепочку экранов по ссылке.
Если работали только с MVVM+C или с NavigationStack в SwiftUI, так и скажите и покажите, что принцип тот же: навигация вынесена из экранов. Честное «VIPER с координатором не использовал, но делал MVVM+C и вот как решал утечки» звучит сильнее пересказа статьи.
Где спотыкаются
Дублируют навигацию: часть переходов в Router, часть в координаторе. Через полгода никто не знает, где искать нужный переход.
Замыкают сильные ссылки в круг: координатор держит модуль, Router держит координатор. Ссылка из Router на координатор должна быть weak, иначе модуль не освобождается.
Не удаляют дочерний координатор после завершения флоу. Экраны давно закрыты, а координатор и его зависимости висят в памяти до перезапуска приложения.