Как реактивное программирование отличается от программирования, управляемого событиями?
Программирование, управляемое событиями, вращается вокруг так называемых событий, которые являются абстрактными вещами, которые запускают «огонь», когда что-то происходит. Другие места в вашем коде «слушать» события и отвечать тем, что им нужно делать, когда это событие происходит. Например, событием может быть «пользователь нажал эту кнопку» или «принтер выполнил печать вашего документа».
Реактивное программирование связано с данными. В конечном счете это особый случай программирования, управляемого событиями. Событие: данные изменены. Обработчик событий: измените некоторые данные (если применимо). Эта концепция обычно очищается, когда вы думаете о таблице. Если вы установили cell1 = cell2 + cell3
, это неявно устанавливает два обработчика событий в событиях с измененными данными cell2
и cell3
для обновления данных cell1
. Данные cell1
не имеют такого обработчика событий, потому что никакие ячейки не зависят от его значения.
TL; DR;
Wikipedia говорит, что существуют различные способы написания реактивного кода, такого как императив, OORP и функционал. Я хочу знать, является ли управляемый событиями просто еще один способ написать реактивный код?
Идея программирования, управляемая событиями, ортогональна идее императива против ОО по сравнению с функциональным.
- Imperitive programming: основное внимание уделяется изменению состояния вашей программы, которая будет достигать того, чего вы хотите. Большинство компьютеров являются обязательными (в отличие от declarative programming), тогда как языки более высокого уровня иногда являются декларативными. Напротив, декларативное программирование касается написания кода, который указывает, ЧТО вы хотите, а не КАК вы хотите, чтобы код выполнял это.
- Object Oriented programming: относится к так называемым объектам или мешкам данных со связанными методами. Отличается от функционального программирования, потому что методы имеют доступ к данным, связанным с объектами.
- Functional programming: относится к повторно используемым функциям или процедурам, которые принимают входы и выходы. Это отличается от программирования OO, поскольку функции традиционно не имеют возможности связывать данные с функцией, отличной от входов и выходов.
Event driven programming: структурирует вашу программу, чтобы иметь дело с («ручкой»), что-то еще, что происходит в вашей программе («событие»).Другими словами, структурирует код логически, как это
When Event1 happens
do A and B
When Event2 happens
do B and C
Но есть много способов, чтобы написать этот код, а на самом деле много способов, чтобы написать код властно, много способов написать это функционально и т.д. Здесь находятся некоторые примеры.
Обязательно следует (с циклом обработки событий):
while(true)
// some other code that you need to do...
if Event1 then
do A
do B
if Event2 then
do B
do C
объектно-ориентированный (с фоновым потоком):
// event queue
events = new EventQueue()
handler = new EventHandler()
// creates background thread
Thread.DoInBackground(handler.listenForEvents(events))
// ... other code ...
// fire an event!
events.enqueue(new Event1())
// other file
class EventHandler
Func listenForEvents(events)
while(true)
while events.count > 0
newEvent = event.dequeue()
this.handleEvent(newEvent)
Thread.Sleep(Time.Seconds(1))
Func handleEvent(event)
if event is Event1
this.A()
this.B()
if event is Event2
this.B()
this.C()
Func A()
// do stuff
return
Func B()
// do stuff
return
Func C()
// do stuff
return
Функциональная (с поддержкой языка для событий)
on Event(1) do Event1Handler()
on Event(2) do Event2Handler()
Func Event1Handler()
do A()
do B()
Func Event2Handler()
do B()
do C()
Func A()
// do stuff
return
Func B()
// do stuff
return
Func C()
// do stuff
return
// ... some other code ...
// fire! ... some languages support features like this, and others have
// libraries with APIs that look a lot like this.
fire Event(1)
Как реактивное программирование связано с обещаниями?
Обещания абстракция потока выполнения программы, которые можно резюмировать следующим образом:
- Автор вопроса: Всякий раз, когда вы закончите делать то, что вы делаете, вы бы мне перезвонить?
- Отвечающий: Конечно вещь, я обещаю
ничего особенного здесь, за исключением того, что это еще один способ думать о том порядке, в котором выполняется код. Например, обещания полезны при обращении к удаленной машине. С обещаниями вы можете сказать «перезвоните мне, когда вернетесь с этого удаленного звонка!». Какую бы библиотеку вы ни использовали, обещает, чтобы перезвонить вам, когда она что-то вернет с удаленной машины. Часто это полезно, потому что он позволяет вам делать что-то еще, не дожидаясь возврата вызова.
Punch line: существует много разных стилей кода, но они не играют слишком большой роли в шаблоне управляемого событиями и реактивного программирования. Насколько мне известно, на большинстве языков вы можете управлять событиями и/или реактивным программированием.
, связанный: [Преимущество функционального реактивного программирования над событиями-слушателями] (http://stackoverflow.com/q/23848221/6445533) – ftor
Выезд: https://www.oreilly.com/ideas/reactive-programming -vs-реактивные системы – XML