Вопрос проверяет понимание того, где должна находиться бизнес-логика и как она изолируется от UI и навигации.
Interactor в VIPER отвечает за бизнес-логику приложения. Он выполняет операции с данными, обращается к сервисам и принимает решения по правилам предметной области. Interactor не знает ничего о UI и навигации. Он общается с Presenter через протоколы. Это делает бизнес-логику изолированной и тестируемой.
Interactor — это центральное место для бизнес-логики в VIPER.
Interactor — компонент VIPER, отвечающий за выполнение бизнес-правил и работу с данными.
Перед тем как рассматривать код, важно чётко определить зону ответственности Interactor.
Interactor:
реализует бизнес-логику
управляет use case’ами
обращается к сервисам и репозиториям
преобразует данные в удобный для Presenter формат
При этом Interactor:
не знает про UIKit
не управляет навигацией
не форматирует данные для отображения
Interactor общается:
с Presenter — через протокол output
с сервисами — через абстракции
protocol UserInteractorInput {
func loadUser()
}
protocol UserInteractorOutput: AnyObject {
func didLoad(user: User)
}
Presenter вызывает Interactor:
interactor.loadUser()
Interactor сообщает результат:
output?.didLoad(user: user)
Если бизнес-логика находится во View или Presenter:
код становится сложно тестировать
появляются зависимости от UI
нарушается SRP
Interactor решает эту проблему, концентрируя логику в одном месте.
Interactor:
легко покрывается unit-тестами
не требует запуска UI
может тестироваться с моками сервисов
Interactor — это «мозг» модуля VIPER. Всё, что связано с бизнес-правилами и use case’ами, должно находиться именно здесь.