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

В чем разница между шаблоном наблюдателя и реактивным программированием?

Недавно я много слышал термин реактивное программирование. Но когда я его искал, то, что я обнаружил, было лишь некоторым сходством с шаблоном наблюдателя. На самом деле, я не могу найти между ними ничего другого. Какая концептуальная разница между ними и почему термин "реактивное программирование" загубит?

4b9b3361

Ответ 1

Реактивное программирование - это общая парадигма, лежащая в основе легко распространяющихся изменений в потоке данных при выполнении программы. Это не конкретный шаблон или сущность как таковая, это идея или стиль программирования (например, объектно-ориентированное прормаминг, функциональное программирование и т.д.). Говоря в общих чертах, это концепция, что когда x изменяется или обновляется в одном месте, вещи, которые зависят от значения x, пересчитываются и обновляются в различных других местах неблокирующим образом, без необходимости связывать потоки, сидящие в ожидании событий.

Традиционно, вы почти всегда видели вышеупомянутый шаблон, где x является событием GUI. Большинство библиотек GUI являются однопоточными, поэтому вы не можете связать этот поток, ожидающий ответа. То, где появляется шаблон наблюдателя - он предоставляет общий метод для предоставления "триггера", позволяющего обновлять информацию при каждом таком изменении (или, в более общих терминах ОО, когда запускается "событие"). в этом смысле он предоставляет простой механизм, позволяющий реализовать базовую концепцию реактивного программирования на ОО (а иногда и на других) языках стиля.

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

Ответ 2

Я эксперт по реактивному программированию и активно занимаюсь разработкой новых инструментов для реактивного программирования. Такие как причинность (https://github.com/erobwen/causality)

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

Другой способ определить, является ли программная парадигма реактивной или нет, это если вы пишете код, который обновляет структуры данных и компоненты пользовательского интерфейса, или если вы пишете код, который выглядит так, как будто он создает компоненты пользовательского интерфейса только в первую очередь. Следовательно:

Нереактивное программирование: код, который создает пользовательский интерфейс + код, который обновляет пользовательский интерфейс.

Реактивное программирование: один блок кода, который создает пользовательский интерфейс (который также будет использоваться для обновлений)

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

Реактивнее сделать то же самое, связать состояние кнопки с переменной режима просмотра, а затем, в свою очередь, связать свойство, которое вы хотите изменить, с этой переменной режима просмотра. Затем, когда пользователь нажмет кнопку, система автоматически узнает, как обновить DOM.

Современными и популярными примерами реактивного программирования являются React и Angular. Например, React реагирует на то, что каждый компонент объявляет свою функцию "рендеринга" для создания пользовательского интерфейса компонента. Ключевым моментом является то, что эта функция рендеринга будет использоваться ОБА как для первоначального рендеринга компонента, так и для случаев, когда изменения в состоянии данных/пользовательского интерфейса вызовут изменения в пользовательском интерфейсе.