c# - rxjava - реактивное программирование rxjs




Реальные примеры Rx (4)

Возможный дубликат:
Хороший пример использования реактивных расширений

Я играю с Reactive Extension в течение некоторого времени, но в основном ограничивается обработкой / составлением пользовательских событий в интерфейсе WPF.

Это такой мощный, новый способ делать асинхронное программирование, и мне любопытно, что с ним делают другие люди, и как вы думаете, что это может улучшить то, как мы сейчас делаем?


Вероятно, мое любимое решение прямо сейчас для Rx - использовать его как агрегатор событий. Посмотрите здесь:

http://jfromaniello.blogspot.com/2010/04/event-aggregator-with-reactive.html

Я адаптировал это для Silverlight, и это работает как шарм. Что удивительно мощно, так это способность фильтровать события. Для примера одно событие просто набирает «строка», потому что другой информации нет. Вместо создания строго типизированного класса для каждого простого события я создал класс, который предоставляет константы (поэтому нет магических строк), например BEGIN_BUSY (при вызове веб-службы), END_BUSY (когда это делается), и т.п.

Чтобы подписаться, вы можете буквально сделать:

(from e in EventAggregator.Subscribe<string>() where e.Equals(BEGIN_BUSY) select true).Subscribe( evt=> { // Listening only to the BEGIN_BUSY event }); 

Любить это!


Мы использовали RX с большим успехом на двух проектах (Silverlight UI) уже. Вначале целью было упростить уровень доступа WCF ). Разумно было то, что в худшем случае мы всегда можем вернуться к стандартному (обратному) способу делать что-то, не затрагивая более высокие уровни пользовательского интерфейса.

Мало ли мы знали, что RX похож на привыкание к наркотикам - как только вы начнете использовать его, просто нет возврата. Подобно вирусу, он быстро распространился с этого уровня коммуникаций на нижнем уровне вплоть до компонентов пользовательского интерфейса:

  • мы начали с простого синтаксического сахара, чтобы упростить доступ к услугам WCF.
  • оттуда это был естественный шаг для расширения RX до асинхронного обмена сообщениями между серверами
  • после этого использовать RX для объединения обоих этих способов для взаимодействия клиента с сервером в один так, чтобы режимы просмотра были агностиками о том, как они получают сообщения, по умолчанию.

И тогда это была полная капитуляция:

  • нужно обрабатывать сообщения, выходящие из строя?
  • нужно, чтобы вспышка ячейки на сетке, когда изменения цен?
  • проблема с производительностью, потому что клиент подвергается бомбардировке сообщениями с сервера?
  • есть рудиментарная логика КЭП?

Ну, угадайте, что для этого есть оператор RX;) (а если нет - вы можете просто написать его)

Самая сложная часть всего этого заключалась в том, чтобы преодолеть это чувство «мое-мозг-болит-так-плохо», что все в нашей команде испытали вначале. Мозг простого смертного, обусловленного многолетним кодированием handle-my-event-by-this-callback, просто не связан с тем, как RX видит мир. В результате RX-код (особенно когда он постепенно становится все более плотным при обработке более сложных сценариев) для неподготовленного ума выглядит как полная абракадабра, которая забавно приводит к тому, что кролик вытащил из кажущейся пустой шляпы. К сожалению, реальность заключается в том, что в производстве нет места для магии в производственном коде, и поэтому вся команда должна быть на борту, а это означает, что всем придется пройти через этот болезненный процесс переделания их мозгов в то, что кажется сначала очень неестественным способом.

Я бы сказал, что это человеческий фактор, а не сам RX API, который является самым большим препятствием для эффективного внедрения RX. Но мальчик стоит того!



Я написал более полную библиотеку для интеграции WPF / Silverlight и Rx, документация (EDIT: no longer lousy!) Прямо сейчас, но вы можете проверить ее:

http://www.reactiveui.net





system.reactive