Как Rx относится к реактивному программированию?

Я читал об основной идее реактивного программирования, заключающейся в том, что переменные изменяются со временем в зависимости от выражения их исходного значения. Я даже реализовал это с помощью выражений. Но потом я смотрю на Microsoft Reactive Extensions (Rx) и вижу нечто совершенно другое. Где переменные, которые со временем самообновляются? Их не видно. Просто какой-то причудливый способ перечисления аргументов события.

Итак, мой вопрос: насколько «реактивным» является Rx на самом деле? Является ли функциональность, которую мы видим сейчас, предвестником того, что будет? Или Microsoft небрежно разбрасывается модным словом? Или я просто полностью упускаю суть (в этом случае я хотел бы, чтобы вы объяснили, как это сделать)?

РЕДАКТИРОВАТЬ: я уже получил несколько отличных ответов с описаниями Rx, кроме того, вопрос закрыт. :( Но я все еще надеюсь услышать больше в духе:

  1. В каком смысле Rx «реактивен»? Я думал, что самообновляющиеся переменные были центральной идеей, но Rx их не предоставляет. LINQ-to-Events кажется лучшим названием для Rx. Я начинаю думать, что, возможно, Microsoft неправильно использовала слово «реактивный», применяя его к Rx.
  2. Каким образом текущая функциональность Rx может быть предшественником самообновляющихся переменных? Я реализовал такой функционал и ничего полезного для этого от Rx не заметил.

person HappyNomad    schedule 08.02.2013    source источник
comment
«переменные» подразумевают сохранение состояния. Rx — это абстракция высокого уровня для создания автоматов без явного отслеживания состояния.   -  person Asti    schedule 08.02.2013
comment
@Asti - Пожалуйста, предложите лучший термин для использования.   -  person HappyNomad    schedule 09.02.2013
comment
Я не вижу большой субъективности в этом вопросе - кажется, он задает очень законный вопрос. Тон ошибки немного близок к «______ отстой, я прав?» но я не думаю, что это намерение.   -  person JDB still remembers Monica    schedule 09.02.2013
comment
@JerKimball - на самом деле я не пытался просить описания Rx, хотя я ценю усилия. Скорее, я хотел бы знать, как Rx относится к реактивному программированию.   -  person HappyNomad    schedule 09.02.2013
comment
@Cyborgx37 - Верно. Я вижу, что Rx полезен, но я не понимаю, насколько он реактивен.   -  person HappyNomad    schedule 09.02.2013
comment
@HappyNomad stackoverflow.com/questions/1028250/   -  person Asti    schedule 09.02.2013
comment
@Asti - я это уже видел, но все равно спасибо. Я все еще планирую прочитать отличный материал для чтения, найденный в ответе Конала. Так что я думаю, это означает, что вы не знаете, какой термин использовать вместо «переменных»… что нормально, так как я узнаю позже.   -  person HappyNomad    schedule 09.02.2013


Ответы (3)


«Реактивный» может быть скорее модным словом, чем что-либо еще, хотя оно хорошо связано с другой языковой концепцией, называемой «Функциональное реактивное программирование»...

В любом случае, на вопрос о том, что такое Rx, ответили гораздо более умные люди, чем я, но я попробую:

  • В начале были вещи; эти вещи имели форму и назывались POCO.

  • Сформированы коллекции этих POCO, поэтому они были названы IEnumerable<T>.

  • «Но что насчет событий, — стонали и причитали люди, — они плохо вписываются в коллекции и группы! Мы должны создать странные и чуждые обработчики вызовов и ответов, чтобы справиться с ними!»

  • Именно тогда Эрик, TheBart и другие посмотрели на эти странные события и подумали: "Эй, мы можем заставить их вести себя как POCO, ибо они всего лишь зеркальное отражение IEnumerable<T>!"

  • Это было рождение IObservable<T>, двойного IEnumerable<T> (потому что поток «выталкивает» информацию к наблюдателю, а не наблюдатель «вытаскивает» элементы)

  • Потом мне надоело писать в «Genesis Mode», и эти действительно умные люди объединили ту же монадическую логику запроса, которая сформировала LINQ, вместе со способностью «путешествовать во времени» с ISchedulers и назвали это «Rx».

person JerKimball    schedule 08.02.2013
comment
Спасибо за это вдумчивое описание Rx. Пожалуйста, смотрите редактирование вопроса. Кроме того, пожалуйста, проголосуйте, чтобы снова открыть его, так как он был закрыт. - person HappyNomad; 09.02.2013
comment
Я хотел бы поставить +100 к этому ответу - person smirkingman; 22.02.2015

О, парень! Хорошо. Я думаю, что основная проблема здесь — словарный запас. Rx часто описывается как Linq to «Event» или что-то в этом роде и реализуется с помощью чего-то, называемого IObservable.

Я уверен, что каждый, кто только начал заниматься Rx, попадал в те же ловушки. Когда мы видим слово «событие», мы думаем о ключевом слове «событие/обработчик событий» и т. д. и т. д. Однако в контексте Rx событие является более общим. Это все, что происходит асинхронно, скорее всего, в другом потоке. Теперь, конечно, одним типом события является событие .net, и есть некоторая ценность в использовании фабричного метода Observable.FromEventPattern для создания обработчика событий-> IObservables, поскольку их жизненный цикл представлен как IDisposable (но подробнее о что позже).

Другое использование Rx — параллелизм данных, поскольку он сильно перекрывается с потоком данных TPL. Типичный шаблон, который я использую для параллельной работы с большими данными, состоит в том, чтобы преобразовать его в Rx IObservable, а затем применить поведение обработки/поточности как монады.

Что касается причудливой части, у IObservable есть поставщик Linq, который позволяет вам использовать Linq для асинхронной обработки асинхронных процессов (например, Спекулятивное исполнение с использованием TPL).

Наконец, IObservable — неудачное имя, поскольку оно приводит к тому, что большинство людей путают его с идеей INPC, поскольку оно похоже на ObservableCollection. Уверяю вас, что нет.

person Aron    schedule 08.02.2013
comment
Спасибо за это вдумчивое описание Rx. Пожалуйста, смотрите редактирование вопроса. - person HappyNomad; 09.02.2013

Реактивное программирование основано на "потоках данных" и "распространении изменений".

Существуют различные способы представления этого. Rx Framework в основном пересматривает традиционную парадигму, основанную на событиях, как потоковое представление событий и обеспечивает операции вокруг этого.

person Reed Copsey    schedule 08.02.2013
comment
Пожалуйста, ознакомьтесь с редактированием вопроса и рассмотрите возможность расширения вашего ответа. Кроме того, пожалуйста, проголосуйте, чтобы снова открыть его, так как он был закрыт. - person HappyNomad; 09.02.2013
comment
@HappyNomad Как я уже сказал, реактивность не обязательно связана с самообновлением переменных, а с потоками данных и распространением изменений. Rx пытается обратиться к другим аспектам реактивного программирования. - person Reed Copsey; 09.02.2013
comment
@Reed_Copsey - Спасибо. Мне придется прочитать об этих концепциях, возможно, в Википедии, когда у меня будет возможность. Тем не менее, было бы неплохо увидеть здесь немного больше подробностей о SO. - person HappyNomad; 09.02.2013