Каковы преимущества и недостатки архитектуры MVVM?

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

Ответ

Преимущества MVVM:

  • Разделение ответственности: View отвечает за отображение, ViewModel — за логику представления и состояние, Model — за бизнес-логику и данные.
  • Упрощение тестирования: ViewModel, не зависящая от UIKit, легко тестируется юнит-тестами.
  • Связь данных (Data Binding): Отлично сочетается с реактивными фреймворками (Combine, RxSwift), обеспечивая автоматическое обновление UI при изменении состояния.
  • Борьба с Massive View Controller: Логика выносится из ViewController, делая его менее нагруженным.

Недостатки MVVM:

  • Усложнение для простых экранов: Может показаться избыточным для экранов с минимальной логикой.
  • Накладные расходы на биндинги: Требуется дополнительный код для связывания View и ViewModel.
  • Риск "раздутия" ViewModel: При неправильном проектировании ViewModel может превратиться в новый Massive View Controller.
  • Отладка: Цепочка преобразований данных и биндингов может усложнить отслеживание ошибок.

Базовый пример на Combine:

// ViewModel
class ProfileViewModel {
    @Published var userName: String = ""

    func loadUser() {
        // Сетевой запрос или работа с базой данных
        userName = "Анна Петрова"
    }
}

// ViewController
viewModel.$userName
    .receive(on: DispatchQueue.main)
    .assign(to: .text, on: nameLabel) // Биндинг через Combine
    .store(in: &cancellables)