Кто является высокоуровневым, а кто низкоуровневым в связке интерактор и сервис
Что проверяют
Знаете ли вы принцип инверсии зависимостей и понимаете ли, что «уровень» определяется близостью к бизнес-правилам, а не положением в цепочке вызовов. Следующий вопрос почти всегда: в каком модуле объявлен протокол и кто от кого зависит в коде.
Как отвечать
Интерактор высокоуровневый, сервис низкоуровневый.
- интерактор (use case): содержит бизнес-правило конкретного сценария: оформить заказ, загрузить профиль, решить, можно ли повторить платёж. Он не знает, откуда пришли данные: из сети, Core Data или кеша;
- сервис: техническая деталь, которая работает с внешним миром:
URLSession, Core Data или SwiftData, Keychain,UserDefaults, аналитика. Бизнес-решений не принимает.
Уровень у Роберта Мартина это расстояние от ввода и вывода: чем дальше код от сети, диска и экрана, тем он выше. Отсюда главное следствие по DIP: высокоуровневый модуль не зависит от низкоуровневого, оба зависят от абстракции, и абстракция принадлежит высокому уровню. В Swift это выглядит так: рядом с интерактором объявлен protocol ProfileRepository, интерактор получает его через init(repository:), а NetworkProfileService в инфраструктурном модуле этот протокол реализует. Зависимость в коде направлена от сервиса к протоколу, хотя вызов идёт от интерактора к сервису.
Практическая польза: интерактор тестируется в XCTest или Swift Testing с заглушкой протокола, без сети, а сервис можно заменить, например перейти с Alamofire на URLSession с async/await, не трогая бизнес-логику.
Где спотыкаются
Путают направление вызова и направление зависимости. «Интерактор вызывает сервис, значит, зависит от него» верно только без инверсии, а весь смысл вопроса именно в ней.
Кладут протокол в модуль сервиса. Тогда слой бизнес-логики всё равно импортирует инфраструктуру, и инверсия остаётся на бумаге.
Отвечают «сервис высокоуровневый, потому что он общий и им пользуются многие интеракторы». Переиспользуемость не поднимает уровень кода: это деталь, от которой бизнес-правила как раз должны быть изолированы.