Я читал об основной идее реактивного программирования, заключающейся в том, что переменные изменяются со временем в зависимости от выражения их исходного значения. Я даже реализовал это с помощью выражений. Но потом я смотрю на Microsoft Reactive Extensions (Rx) и вижу нечто совершенно другое. Где переменные, которые со временем самообновляются? Их не видно. Просто какой-то причудливый способ перечисления аргументов события.
Итак, мой вопрос: насколько "реактивным" является Rx на самом деле? Является ли функциональность, которую мы видим сейчас, предвестником того, что будет? Или Microsoft небрежно разбрасывается модным словом? Или я просто полностью упускаю суть (в этом случае я хотел бы, чтобы вы объяснили, как это сделать)?
РЕДАКТИРОВАТЬ: я уже получил несколько отличных ответов с описаниями Rx, кроме того, вопрос закрыт. :( Но я все еще надеюсь услышать больше в духе:
В каком смысле Rx "реактивен"? Я думал, что самообновляющиеся переменные были центральной идеей, но Rx их не предоставляет. LINQ-to-Events кажется лучшим названием для Rx. Я начинаю думать, что, возможно, Microsoft неправильно использовала слово "реактивный", применяя его к Rx.
Каким образом текущая функциональность Rx может быть предшественником самообновляющихся переменных? Я реализовал такой функционал и ничего полезного для этого от Rx не заметил.
"переменные" подразумевают сохранение состояния. Rx - это абстракция высокого уровня для создания автоматов без явного отслеживания состояния. Asti 08.02.2013
@Asti - Пожалуйста, предложите лучший термин для использования. HappyNomad 09.02.2013
Я не вижу большой субъективности в этом вопросе - кажется, он задает очень законный вопрос. Тон ошибки немного близок к "______ отстой, я прав?" но я не думаю, что это намерение. JDB still remembers Monica 09.02.2013
@JerKimball - на самом деле я не пытался просить описания Rx, хотя я ценю усилия. Скорее, я хотел бы знать, как Rx относится к реактивному программированию. HappyNomad 09.02.2013
@Cyborgx37 - Верно. Я вижу, что Rx полезен, но я не понимаю, насколько он реактивен. HappyNomad 09.02.2013
@HappyNomad stackoverflow.com/questions/1028250/ Asti 09.02.2013
"Реактивный" может быть скорее модным словом, чем что-либо еще, хотя оно хорошо связано с другой языковой концепцией, называемой "Функциональное реактивное программирование"...
В любом случае, на вопрос о том, что такое Rx, ответили гораздо более умные люди, чем я, но я попробую:
В начале были вещи; эти вещи имели форму и назывались POCO.
Сформированы коллекции этих POCO, поэтому они были названы IEnumerable<T>.
"Но что насчет событий, - стонали и причитали люди, - они плохо вписываются в коллекции и группы! Мы должны создать странные и чуждые обработчики вызовов и ответов, чтобы справиться с ними!"
Именно тогда Эрик, TheBart и другие посмотрели на эти странные события и подумали: "Эй, мы можем заставить их вести себя как POCO, ибо они всего лишь зеркальное отражение IEnumerable<T>!"
Это было рождение IObservable<T>, двойного IEnumerable<T> (потому что поток "выталкивает" информацию к наблюдателю, а не наблюдатель "вытаскивает" элементы)
Потом мне надоело писать в "Genesis Mode", и эти действительно умные люди объединили ту же монадическую логику запроса, которая сформировала LINQ, вместе со способностью "путешествовать во времени" с ISchedulers и назвали это "Rx".
Ответ 2 · рейтинг 2 · Aron
О, парень! Хорошо. Я думаю, что основная проблема здесь - словарный запас. Rx часто описывается как Linq to "Event" или что-то в этом роде и реализуется с помощью чего-то, называемого IObservable.
Я уверен, что каждый, кто только начал заниматься Rx, попадал в те же ловушки. Когда мы видим слово "событие", мы думаем о ключевом слове "событие/обработчик событий" и т. д. и т. д. Однако в контексте Rx событие является более общим. Это все, что происходит асинхронно, скорее всего, в другом потоке. Теперь, конечно, одним типом события является событие .net, и есть некоторая ценность в использовании фабричного метода Observable.FromEventPattern для создания обработчика событий-> IObservables, поскольку их жизненный цикл представлен как IDisposable (но подробнее о что позже).
Другое использование Rx - параллелизм данных, поскольку он сильно перекрывается с потоком данных TPL. Типичный шаблон, который я использую для параллельной работы с большими данными, состоит в том, чтобы преобразовать его в Rx IObservable, а затем применить поведение обработки/поточности как монады.
Что касается причудливой части, у IObservable есть поставщик Linq, который позволяет вам использовать Linq для асинхронной обработки асинхронных процессов (например, Спекулятивное исполнение с использованием TPL).
Наконец, IObservable - неудачное имя, поскольку оно приводит к тому, что большинство людей путают его с идеей INPC, поскольку оно похоже на ObservableCollection. Уверяю вас, что нет.
Существуют различные способы представления этого. Rx Framework в основном пересматривает традиционную парадигму, основанную на событиях, как потоковое представление событий и обеспечивает операции вокруг этого.