Ответ
Model-View-Presenter (MVP) — хороший выбор, когда нужна лучшая тестируемость и разделение ответственности по сравнению с MVC, но без сложности MVVM.
Ключевые сценарии использования:
- Проекты средней сложности – где бизнес-логика становится объемной, но реактивное программирование не требуется.
- Акцент на модульное тестирование – Presenter содержит логику и не зависит от UIKit, что делает его легким для тестирования.
- Четкое разделение слоев – View отвечает только за отображение, Presenter — за логику представления и обработку действий пользователя.
- Постепенная миграция с 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 и потенциальное увеличение количества протоколов.