В чем разница между Presenter и Interactor в архитектуре VIPER/Clean?

«В чем разница между Presenter и Interactor в архитектуре VIPER/Clean?» — вопрос из категории Архитектура, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Presenter и Interactor — это два разных слоя в архитектурах VIPER или Clean, каждый со своей зоной ответственности.

Interactor (Слой бизнес-логики)

  • Что делает: Содержит чистую бизнес-логику приложения.
  • Ответственность: Получение и обработка данных из репозиториев (API, базы данных), выполнение бизнес-правил.
  • Не знает о: Существовании UI (View). Работает с простыми моделями данных (Entities).

Presenter (Слой логики представления)

  • Что делает: Подготавливает данные для отображения на UI.
  • Ответственность: Получает сырые данные от Interactor, форматирует их (например, в строки дат), преобразует в удобные для View модели (View Models). Управляет состоянием View.
  • Не знает о: Конкретной реализации UI-элементов (UIKit/SwiftUI).

Ключевое отличие: Interactor работает с бизнес-логикой и данными, а Presenter — с логикой представления и подготовкой данных для UI.

Пример на Swift:

// Interactor работает с бизнес-моделями (Entity)
protocol UserInteractorProtocol {
    func fetchUsers() -> [UserEntity]
}

// Presenter преобразует Entity в View-модели
protocol UserPresenterProtocol {
    func prepareUserList() -> [UserViewModel]
}

class UserPresenter: UserPresenterProtocol {
    private let interactor: UserInteractorProtocol

    func prepareUserList() -> [UserViewModel] {
        let users = interactor.fetchUsers() // Получаем Entity
        // Преобразуем в удобный для View формат
        return users.map { UserViewModel(name: $0.fullName, age: "($0.age) лет") }
    }
}