Разница в основном связана с тем, как вы "настраиваете" (или объявляете) условность вещей: что происходит с чем-то, когда происходит что-то другое.
В реактивном программировании вы объявляете реакцию на изменение. Вам не нужно заранее предвидеть реакцию, необходимую для этого изменения, вы можете добавить - объявить - эту реакцию в любое время позже. Поэтому ее можно рассматривать как стратегию «вытягивания» или «наблюдания».
Таким образом, в реактивном программировании вы подключаетесь к / отслеживаете данные, которые, как вы знаете, существуют. Данные здесь имеют решающее значение.
Пример: пользователь щелкнул элемент на странице -> обновить счетчик количества кликов, сделанных пользователем.
Пример приложения-калькулятора: дисплей калькулятора привязан ко всем кнопкам и реагирует на любое изменение (нажатие кнопок) собственным изменением на дисплее. Кнопки не знают, что их нажатия могут быть использованы любыми другими частями.
В программировании, управляемом событиями, вы запускаете событие в определенной ситуации в императивно написанном коде. Здесь вам нужно быть явным заранее, потому что событие должно быть инициировано первым, чтобы быть полученным позже, потому что в основном вы отправляете событие в часть кода, где происходит изменение. Итак, это стратегия «толкания».
Таким образом, в программировании, управляемом событиями, вы отправляете событие в определенной ситуации, которое возможно было бы получено некоторые другие части кода. Здесь важна ситуация, данные не имеют значения.
Пример: кто-то посетил страницу контактов -> инициировать событие (которое может вообще не быть получено ни одним слушателем, что является типичным случаем для многих модулей и библиотек).
Пример приложения-калькулятора: дисплей калькулятора — это просто слушатель, а кнопки запускают события. Кнопки должны знать, что они существуют в определенном контексте (но, благодаря шаблону прослушивателя событий, им не обязательно знать, что это за контекст), и поэтому они должны запускать мероприятие.
Так что в большинстве случаев это просто разные условности. Посмотрите на этот простой пример. Пример императивного подхода:
event: perform some operation on a, e.g. a += value, and trigger the event
listener: counter++
И пример реактивного декларативного подхода:
counter: whenever an operation on a occurs, react with this: counter++
В последнем примере не нужно ничего запускать — вы просто «подключаетесь» с реакцией на все, что может произойти.
Таким образом, вы можете сказать, что реакция связана с a
в реактивном подходе, в то время как в императивном подходе, управляемом событиями, вы отправляете событие, которое позже может быть получено слушателем, и, поскольку этот тип подхода никаким образом не связан с данными , вы можете изменить это: a += value
на любое другое позже, даже полностью удалив a
. Подход, основанный на событиях, по существу не имеет ничего общего с данными.
Итак, как вы видите, реактивное программирование ориентировано на данные (изменение данных реагирует на срабатывание другого кода), тогда как программирование, управляемое событиями, ориентировано на процесс (не имеет значения, изменяются ли данные и какие, если они вообще есть — вы просто запускаете событие, которое будет получено некоторыми другими частями кода). В последнем случае вам нужно знать, что это «информирование» других частей кода требуется, и вы должны затем предвидеть, что событие должно быть вызвано. В первом случае вам не нужно этого делать, вы можете сделать это в любое время или вообще не делать - никаких инициирующих событий не требуется - но хитрость здесь в том, что должно быть "что-то", к чему вы можете подключиться. объявление вашей реакции, своего рода наблюдатели, которые позволяют вам реагировать на наблюдаемые изменения.
person
forsberg
schedule
21.05.2020