В чем разница между архитектурными паттернами MVC, MVP и MVVM?

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

Ответ

MVC (Model-View-Controller)

  • Model: Хранит данные и бизнес-логику.
  • View: Отображает интерфейс, пассивна.
  • Controller: Обрабатывает пользовательский ввод, обновляет Model и View. В iOS UIViewController часто становится "массивным" (Massive View Controller), так как поглощает слишком много логики.
  • Связь: View и Model общаются через Controller.

MVP (Model-View-Presenter)

  • Presenter: Заменяет Controller, содержит всю логику отображения. Не зависит от UIKit/AppKit.
  • View: Пассивна, реализует протокол для обновления UI.
  • Ключевое: Четкое разделение, Presenter легко тестируется.
    
    // View Protocol
    protocol GreetingViewProtocol: AnyObject {
    func setGreeting(text: String)
    }

// Presenter class GreetingPresenter { weak var view: GreetingViewProtocol? let model: User func didTapButton() { let greeting = "Hello, (model.name)!" view?.setGreeting(text: greeting) // Явный вызов метода View } }


**MVVM (Model-View-ViewModel)**
*   **ViewModel:** Преобразует данные Model для View. Не содержит ссылок на View.
*   **View:** (ViewController/View) наблюдает за изменениями в ViewModel через биндинги (Combine, RxSwift).
*   **Ключевое:** Реактивное программирование, автоматическое обновление UI.
```swift
// ViewModel
class UserViewModel {
    @Published var userName: String = "" // Наблюдаемое свойство
    func fetchUser() {
        userName = "Jane Doe" // View автоматически обновится
    }
}

// View (ViewController)
viewModel.$userName
    .receive(on: DispatchQueue.main)
    .assign(to: .text, on: nameLabel) // Биндинг

Сравнение:

  • Связь: MVC имеет прямую связь, MVP и MVVM — нет.
  • Тестируемость: MVP и MVVM тестируются лучше MVC.
  • Подход: MVP — императивный (явные вызовы), MVVM — реактивный (автоматические обновления).