Подтвердить что ты не робот

Как реактивное программирование отличается от программирования, управляемого событиями?

Я изучаю реактивное программирование и функциональное реактивное программирование в JavaScript. Я очень смущен.

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

Как реактивное программирование связано с Promises? Я думаю, что promises является альтернативой аддону и управляемому событиям.

4b9b3361

Ответ 1

Как реактивное программирование связано с Promises? Я думаю, что обещание - это альтернатива аддону и обратному адду.

На практике эти два связаны друг с другом, мне нравится называть Promises шлюзом лекарственное средство для функционального реактивного программирования.

+----------------------+--------+-------------+
|                      |  Sync  |    Async    |
+----------------------+--------+-------------+
| Single value or null | Option | Promise     |
| Multiple values      | List   | EventStream |
+----------------------+--------+-------------+

Promises можно рассматривать как EventStream с одним элементом, или вы можете думать о EventStreams как о множественном Promises со временем.

Promises может быть скован, что приближается к реактивному программированию:

getUser() // return promise
   .then((userId) => {
       return fetch("/users/"+userId)
   })
   .then((user) => {
       alert("Fetched user: " + user.name)
   })

То же самое с bacon.js:

const userStream = userIdStream // EventStream of userIds
   .flatMapLatest((userId) => {
       return Bacon.fromPromise(fetch("/users/"+userId))
   })
const userNameStream = userStream.map((user) => user.name)
userNameStream.onValue((user) => {
   alert("Fetched user: " + user.name)
})

Оба фрагмента кода выполняют одно и то же, но есть большая разница в мышлении: с помощью Promises вы думаете о том, чтобы обрабатывать одно действие с помощью асинхронных шагов ясным способом - мышление обязательно, вы делаете шаг шаг за шагом. С FRP вы говорите: "поток имен пользователей создается из потока userIds, применяя эти два шага преобразования". Когда у вас есть поток имен пользователей, не заботясь о том, откуда они пришли, и говорите "всякий раз, когда есть новое имя пользователя, покажите его пользователю".

Стиль кодирования FRP поможет вам моделировать вашу проблему как поток значений (т.е. значения, которые меняются со временем) и отношения между этими значениями. Если вы уже знаете Promises, начальная кривая обучения будет немного проще, но основное преимущество будет достигнуто только тогда, когда вы начнете думать и моделировать проблему по-другому - возможно (если не очень полезно) сделать императивное программирование с помощью FRP библиотеки.

Ответ 2

Как реактивное программирование отличается от программирования, управляемого событиями?

Программирование, управляемое событиями, вращается вокруг так называемых событий, которые являются абстрактными вещами, которые программы "стреляют", когда что-то происходит. Другие места в вашем коде "слушать" события и отвечать тем, что им нужно делать, когда это событие происходит. Например, событием может быть "пользователь нажал эту кнопку" или "принтер распечатал документ".

Реактивное программирование имеет дело с данными. В конечном счете это особый случай программирования, управляемого событиями. Событие: данные изменены. Обработчик событий: измените некоторые данные (если применимо). Эта концепция обычно очищается, когда вы думаете о таблице. Если вы установите cell1 = cell2 + cell3, это неявно устанавливает два обработчика событий в данных, измененных событиями cell2 и cell3, для обновления данных cell1. cell1 у данных нет такого обработчика событий, поскольку никакие ячейки не зависят от его значения.


TL; DR;

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

Идея программирования, управляемого событиями, ортогональна идее императива против OO против функционала.

  • Императивное программирование: фокусируется на изменении состояния вашей программы, и вы достигнете того, чего хотите. Большинство компьютеров являются обязательными (в отличие от декларативное программирование), тогда как языки более высокого уровня иногда являются декларативными. Напротив, декларативное программирование касается написания кода, который указывает, ЧТО вы хотите, а не КАК вы хотите, чтобы код выполнял его.
  • O bject O ориентированное программирование: касается так называемых объектов или мешки данных со связанными методами. Отличается от функционального программирования, потому что методы имеют доступ к данным, связанным с объектами.
  • Функциональное программирование: относится к повторно используемым функциям или процедурам, которые принимают входы и выходы. Это отличается от программирования OO, поскольку функции традиционно не имеют возможности связывать данные с функцией, отличной от входов и выходов.

Программирование, управляемое событиями: структурирует вашу программу, чтобы иметь дело с ( "обработать" ) что-то еще, что происходит в вашей программе ( "событие" "). Другими словами, он логически строит ваш код следующим образом

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)

Как реактивное программирование связано с Promises?

Promises - это абстракция потока выполнения программы, которую можно суммировать следующим образом:

  • Аскер: Всякий раз, когда ты закончишь делать то, что делаешь, ты мне позвонишь?
  • Ответ: Конечно, я обещаю

Здесь нет ничего особенного, кроме как другой способ подумать о порядке, в котором выполняется ваш код. Например, promises полезны, когда вы делаете вызов удаленной машине. С помощью promises вы можете сказать: "Перезвоните мне, когда вы вернетесь с этого удаленного вызова!". В зависимости от того, какая библиотека вы используете, promises, чтобы перезвонить вам, когда она вернется с удаленного компьютера. Часто это полезно, потому что позволяет вам делать что-то еще, не дожидаясь возврата вызова.

Punch line: существует много разных стилей кода, но они не играют слишком большой роли в шаблоне управляемого событиями и реактивного программирования. Насколько мне известно, в большинстве языков вы можете выполнять управляемое событиями и/или реактивное программирование.

Ответ 3

Мне это нравится сравнивать апельсины с яблоками. Попробуйте определить простым способом, что и что отличает вещи:

Реактивное программирование - это парадигма программирования, которая применяется, когда требуется достичь функциональности, сходной с привязкой данных в таких библиотеках, как KnockoutJS. Также примером могут служить формулы Excel: все ячейки похожи на переменные в памяти. Есть те, которые просто содержат некоторые данные и те, которые вычисляются из этих данных. Если первое изменяется, то и последнее. Обратите внимание, что парадигма касается реализации более низкого уровня; когда кто-то говорит о реактивном программировании, они ссылаются на данные, его изменения и то, что происходит, когда оно мутирует.

С другой стороны, управляемое событиями программирование относится к системной архитектуре. Согласно этой парадигме события и обработчики событий являются основой системы, и все построено на них и вокруг них. Обычными примерами могут быть мультиплексирование пользовательского интерфейса и веб-сервера. Вы чувствуете, как все это по-другому? Парадигма применяется на уровне всей системы или подсистемы.

Как реактивное программирование связано с Promises? Я думаю, что promisesальтернатива аддону, управляемому событиями и обратным вызовом.

Promise - это инструмент для достижения concurrency и конкретного порядка выполнения. Он может использоваться в любой парадигме.

На практике парадигмы служат различным целям и на разных уровнях. Вы можете иметь управляемый событиями дизайн с некоторыми битами реактивного кода. Вы можете иметь распределенную систему, которая использует реактивные шаблоны проектирования. Однако события, в конечном счете, являются концепцией более высокого уровня. Реактивная информация о данных и их переоценке, подход к реализации или ее детали, а события - это то, что естественно возникает из случая и управляет вашим дизайном.

Ответ 4

Реактивное программирование - это все о потоках, это могут быть потоки событий или что-то еще. Он отправляет/анонсирует эти потоки или подписывается/просматривает эти потоки или потоковые преобразования, которые приводят к некоторым событиям. Таким образом, парадигмы программирования связаны между собой.