ReactiveUI (RxUI) против реактивных расширений

Из http://docs.reactiveui.net/en/index.html:

ReactiveUI — это инфраструктура MVVM, которая позволяет использовать Reactive Extensions для .NET для создания элегантных, тестируемых пользовательских интерфейсов, которые работают на любой мобильной или настольной платформе.

RxUI как-то отличается от Reactive Extensions?

Почему я должен предпочесть RxUI, а не MVVMCross/light+Rx? Что такого особенного? Может ли RxUI делать то, чего не может Rx? Это более лаконично? Он более уютный?

Я видел пример на странице github https://github.com/reactiveui/ReactiveUI#a-compelling-example. Но разве я не могу сделать то же самое только с Rx?

P.S. Есть ли где-нибудь документация по API?


person tower120    schedule 11.01.2016    source источник


Ответы (1)


Вы включили сюда много вопросов, поэтому я отвечу на них один за другим.

RxUI как-то отличается от Reactive Extensions?

да. Reactive Extensions — это библиотека для создания асинхронных и событийных программ с использованием наблюдаемых последовательностей и запросов в стиле LINQ. операторы. Это не имеет ничего общего с пользовательским интерфейсом. Rx предоставляет вам общую абстракцию над потоком данных.

RxUI — это инфраструктура MVVM, что означает это библиотека классов, помогающая реализовать шаблон MVVM в вашем приложении.

Может ли RxUI делать то, чего не может Rx? Это более лаконично? Он более уютный?

Он служит другой цели. Rx предоставляет набор методов, которые обычно помогают перемещать данные в вашем приложении. RxUI используется для создания пользовательских интерфейсов. Он использует Rx под капотом, а также предоставляет API-интерфейс типа Rx (а именно, IObservable<T>) из его компонентов.

Например, Реализация ICommand в ReactiveUI, называемая ReactiveCommand, предоставляет свойство с именем ThrownException , который имеет тип IObservable<Exception> (его можно прочитать как последовательность ошибок).

Обратите внимание, что хотя тип интерфейса IObservable<T> является частью библиотеки базовых классов .Net, буквально все полезные функции, работающие с этим типом, включены в библиотеку Reactive Extensions.

Но разве я не могу сделать то же самое только с Rx?

Нет, потому что, например, Rx не предоставляет вам реализацию ICommand, жизненно важную часть каждой среды MVVM.

Почему я должен предпочесть RxUI, а не MVVMCross/light+Rx? Что такого особенного?

Если вы хотите часто использовать Reactive Extensions в своем приложении, вы можете предпочесть использовать RxUI (а не другую инфраструктуру MVVM), потому что они очень хорошо интегрируются друг с другом. В сочетании они предоставляют вам множество функций из коробки (ознакомьтесь, например, с ReactiveCommand или WhenAny.

При этом как заявил создатель RxUI:

вы можете использовать ReactiveUI вместе с другими инфраструктурами MVVM, вам не нужно фиксировать ту или иную. Многие методы в RxUI, такие как WhenAny, работают с любыми объектами и во время выполнения определяют, как лучше всего к ним подключиться.

RxUI — это определенно фуршетный стол (бери, что хочешь!), а не обед из семи блюд :)

И наконец:

P.S. Есть ли где-нибудь документация по API?

Да, есть! Посмотрите здесь: https://reactiveui.net/api/

В качестве примечания: не стесняйтесь просматривать раздел документации по реактивному программированию, в котором объясняется вам некоторые из основных терминов и понятий, стоящих за фреймворком :)

person pmbanka    schedule 11.01.2016
comment
Реализация асинхронности RxUI медленнее, чем async/await? Я планирую использовать его на устройствах Android, так что это может иметь значение... - person tower120; 11.01.2016
comment
Ну, действительно сложно/невозможно ответить на поставленный таким образом вопрос (см. com/2012/12/17/performance-rant, чтобы узнать почему!). Кроме того, вы имели в виду реализацию асинхронности Rx? Потому что RxUI ничего подобного не реализует. Более того, RxUI очень хорошо взаимодействует как с Rx, так и с TPL (он же async await). - person pmbanka; 11.01.2016
comment
нет, я скорее имел в виду async/await (который происходит в том же потоке) против запуска нового потока. На самом деле я не знаю, как это реализовано в Rx. Но я знаю, что async/await настолько быстр, насколько это возможно... И синхронизация между потоками может занимать много процессорного времени. - person tower120; 12.01.2016
comment
Взгляните на reactivex.io/documentation/scheduler.html, чтобы узнать, как Rx обрабатывает многопоточность. Вы также можете задать отдельный вопрос, потому что эта тема несколько сложна. - person pmbanka; 12.01.2016