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

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

Ответ

MVC (Model-View-Controller) и MVVM (Model-View-ViewModel) — это архитектурные паттерны, разделяющие ответственность в приложении для улучшения тестируемости и поддержки кода. Основное различие — в механизме связи между слоями.

MVC (Model-View-Controller)

Классический паттерн, широко используемый в веб-фреймворках (ASP.NET MVC, Spring MVC).

  • Model: Представляет бизнес-логику и данные.
  • View: Отвечает за отображение данных пользователю (HTML-страница).
  • Controller: Обрабатывает пользовательский ввод (HTTP-запрос), взаимодействует с Model и выбирает View для отображения результата.

Поток данных: Пользователь -> Controller -> Model -> View -> Пользователь. Связь между View и Model, как правило, односторонняя и опосредованная через Controller.

MVVM (Model-View-ViewModel)

Паттерн, популяризированный фреймворками с богатым клиентским интерфейсом (WPF, Xamarin, Angular, Vue.js).

  • Model: Представляет бизнес-логику и данные (аналогично MVC).
  • View: Отвечает за отображение и пользовательский интерфейс (XAML, HTML-шаблон).
  • ViewModel: Посредник между View и Model. Представляет собой абстракцию View, содержащую данные (properties) и команды (commands), к которым View может привязываться.

Ключевая концепция — Data Binding:

// ViewModel (C# в WPF)
public class UserViewModel : INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            OnPropertyChanged(); // Уведомление View об изменении
        }
    }
    public ICommand SaveCommand { get; private set; }
}

<!-- View (XAML в WPF) -->
<TextBox Text="{Binding Name, Mode=TwoWay}"/>
<Button Command="{Binding SaveCommand}" Content="Save"/>

Основные отличия

Аспект MVC MVVM
Связь View и данных Контроллер передает данные в View (часто через ViewBag или модель). Двусторонняя привязка данных (Data Binding) между View и ViewModel.
Ответственность View Пассивная, только отображение. Активная, содержит привязки к командам и данным ViewModel.
Тестируемость UI-логики Сложнее, так как Controller часто связан с HTTP-контекстом. Легче, ViewModel — это обычный класс, не зависящий от UI.
Типичное применение Серверные веб-приложения. Клиентские приложения с богатым UI (WPF, UWP, мобильные, SPA).

Вывод: Выбор зависит от платформы. MVC идеален для традиционных серверных веб-приложений. MVVM создан для клиентских приложений, где мощная система привязки данных позволяет эффективно разделять UI и бизнес-логику.