Реактивное программирование против шаблона MVVM для управления обновлениями графического интерфейса

11

Реактивное программирование и MVVM - это два подхода, которые могут решить проблему отделения доменного уровня от пользовательского интерфейса.

  • MVVM делает это путем определения модели представления, которая представляет собой структуру данных, сопоставленную с компонентами пользовательского интерфейса. Пользовательский интерфейс отображает данные и, возможно, обновляет их при появлении пользователя.
  • реактивная структура определяет график наблюдаемых, которые уведомляют пользовательский интерфейс о том, что часть данных изменилась

Реактивные фреймворки завоевывают популярность как на основных платформах (с Rx в .net & java, Reaction.js), так и в более экспериментальных местах (FRP в haskell).

Я в основном использовал MVVM с angular, и я нахожу соотношение простоты и выразительности вполне удовлетворительным, хотя с ним я работал только над небольшими / средними проектами.

Что реактивная структура покупает разработчику, а mvvm - нет?

Есть ли разница? Например, knockout.js объявлен как фреймворк mvvm, но в его интерфейсе чувствуется реактивность:

this.firstName = ko.observable("John");
this.lastName = ko.observable("Smith");

this.fullName = ko.computed(function() {
    return this.firstName() + " " + this.lastName();
}, this);
Саймон Бергот
источник
MVVM - это шаблон, позволяющий отделить представление от домена. Реактивные структуры - это инструменты, которые можно использовать для достижения этой схемы разделения. Они не являются эксклюзивными.
AlexFoxGill
@AlexG Ну, есть инструменты, которые координируют связь между моделью представления и пользовательским интерфейсом. Я бы назвал эти рамки MVVM.
Саймон Бергот
Суть в том, что KnockoutJS использует реактивную среду, позволяющую разделить проблемы MVVM. AngularJS использует грязную проверку для включения MVVM. Это просто разные способы достижения шаблона. Возможно, ваш вопрос таков: «Чего достигает парадигма Reactive в среде MVVM, чего нет в методе Dirty-Checking?»
AlexFoxGill
@ AlexG, так вы бы сказали, что это деталь реализации? Я думаю, что это отвечает на мой вопрос.
Саймон Бергот
@Simon: я бы не квалифицировал это как детали реализации, а скорее как разные подходы к сообщению изменений в Модели вплоть до ViewModel
Барт ван Инген Шенау

Ответы:

10

Это разные неконкурентные концепции, и они могут легко работать вместе, чтобы дать отличный результат.

С точки зрения непрофессионала:

MVVM полезен, чтобы уйти от беспорядка кода (GUI / модель). Реактивный подход полезен для уменьшения беспорядка события / обратного вызова.

Я бы порекомендовал немного узнать о XAML / WPF, поскольку Microsoft является первоначальным изобретателем MVVM. Microsoft также разработала очень хорошую реализацию подхода Reactive: Reactive Extensions.

Вот достойная попытка объединить их:

http://www.reactiveui.net https://github.com/reactiveui/ReactiveUI

Связанный так вопрос:

/programming/1763411/reactive-extensions-rx-mvvm

логово
источник