В каких случаях выбирают архитектурный паттерн MVP для iOS?

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

Ответ

Model-View-Presenter (MVP) — хороший выбор, когда нужна лучшая тестируемость и разделение ответственности по сравнению с MVC, но без сложности MVVM.

Ключевые сценарии использования:

  1. Проекты средней сложности – где бизнес-логика становится объемной, но реактивное программирование не требуется.
  2. Акцент на модульное тестированиеPresenter содержит логику и не зависит от UIKit, что делает его легким для тестирования.
  3. Четкое разделение слоев – View отвечает только за отображение, Presenter — за логику представления и обработку действий пользователя.
  4. Постепенная миграция с MVC – MVP логически следует за MVC, что упрощает рефакторинг.

Пример реализации на Swift:

// View Protocol
protocol LoginViewProtocol: AnyObject {
    func showLoading(_ isLoading: Bool)
    func showError(message: String)
    func navigateToHome()
}

// Presenter
class LoginPresenter {
    weak var view: LoginViewProtocol?
    private let authService: AuthServiceProtocol

    init(authService: AuthServiceProtocol) {
        self.authService = authService
    }

    func loginButtonTapped(email: String, password: String) {
        view?.showLoading(true)
        authService.login(email: email, password: password) { [weak self] result in
            self?.view?.showLoading(false)
            switch result {
            case .success:
                self?.view?.navigateToHome()
            case .failure(let error):
                self?.view?.showError(message: error.localizedDescription)
            }
        }
    }
}

Недостаток: Необходимость ручного обновления View и потенциальное увеличение количества протоколов.