Как следует из названия, реактивное программирование ориентировано на реакцию, поток данных и принцип причинности, а это означает, что каждая причина связана со своими следствиями.

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

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

Немного теории

Манифест реактивного программирования был переписан в конце 2014 года и, согласно ему, реактивные системы имеют 4 особенности:

  • Оперативность: они ориентированы на быстрое и стабильное время отклика. Обработка ошибок упрощена и поощряет взаимодействие с пользователем
  • Отказоустойчивость: системы будут реагировать даже при наличии ошибок. Для этого отказы должны быть изолированы и локализованы в компонентах, а также иметь возможность восстанавливаться без нарушения целостности.
  • Эластичность: поскольку они адаптируются к изменениям рабочей нагрузки, динамически распределяя и освобождая ресурсы, а также потому, что их компоненты спроектированы таким образом, чтобы их компоненты не образовывали узких мест.
  • Ориентированные сообщения: обмен асинхронными сообщениями полностью доверен. Блокирования связи не существует. Здесь следует учитывать эластичность, ошибки и сообщения.

Эластичность отличается от масштабируемости:программа не определяется вместе с ресурсами; они автоматически выделяются во время выполнения (очень похоже на функциональное программирование).

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

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

Просмотр потоков данных

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

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

• Карта: Применяет преобразование в качестве параметра, передаваемого к выбросам потока данных.

• FlatMap: создайте асинхронные приложения для потока данных, а затем сведите выбросы к простому наблюдаемому.

• Concat: объединяет выбросы двух или более потоков, не пересекая их (обратите внимание, что потоки должны «закончиться», чтобы это было применимо).

• Объединение: объединяет несколько потоков и блокирует выбросы.

Все эти диаграммы могут отображаться интерактивно на этом сайте. Можете ли вы угадать, что делают эти две операции? Операция1, Операция2.

Возможно, самая сложная часть программирования — это не само реактивное программирование; как сложно думать о том, «как» справляться с обычными проблемами. Например, если мне нужно, чтобы действие запускалось, когда пользователь выполняет несколько кликов по элементу, поток связи должен быть примерно следующим:

Как видите, здесь нет временных переменных, буферов, промисов, активных проверок или других традиционных ресурсов программирования. Только потоки, выбросы и четыре строчки кода.

Среды и языки для использования реактивного программирования

Мы можем найти специально реактивные языки, такие как Elm и R. Большинство фреймворков, имеющих реактивную часть, доступны для .NET и JavaScript. В JavaScript мы можем найти MeteorJS, ProActJS, BaconJS и React.

Возможно, основным показателем является Reactive Extensions или просто ReactiveX Rx (все названия обозначают одно и то же). Это API для асинхронного и реактивного программирования, доступный для Java, JavaScript (+ Angular), C# (+ Unity), Ruby, Python, PHP и других. Всего имеется 402 наблюдаемых операции, каждой из которых соответствует своя диаграмма шариков.

Вот пример интеграции с Angular при поиске страницы в Википедии: