Реактивное программирование: различия между версиями
Dzmuh (обсуждение | вклад) |
Dzmuh (обсуждение | вклад) |
||
| (не показана 1 промежуточная версия этого же участника) | |||
| Строка 41: | Строка 41: | ||
Наблюдаемые модели позволяют другим системам получать события, когда их состояние изменяется. Это обеспечивает связь в реальном времени между пользователями и системами. | Наблюдаемые модели позволяют другим системам получать события, когда их состояние изменяется. Это обеспечивает связь в реальном времени между пользователями и системами. | ||
{{Notice | {{Notice|Например, когда несколько пользователей работают одновременно над одной и той же моделью, изменения могут реактивно синхронизироваться между ними, избавляя от необходимости блокировки модели.}} | ||
Потоки событий образуют базовую абстракцию, на которой строятся такие связи. Сохраняя их реактивными, мы избегаем блокировок и позволяем преобразованиям и коммуникациям быть асинхронными и неблокирующими. | |||
{{Notice|Реактивные приложения должны иметь знание о порядках алгоритмов, чтобы быть уверенным, что время отклика на события не превышает O(1) или, как минимум, O(log n) независимо от нагрузки. Может быть включён коэффициент масштабирования, но он не должен зависеть от количества клиентов, сессий, продуктов или сделок.}} | |||
== Реактивные подходы к программированию == | == Реактивные подходы к программированию == | ||
| Строка 53: | Строка 56: | ||
=== Функциональное реактивное программирование === | === Функциональное реактивное программирование === | ||
[[Функциональное программирование]] является наиболее естественным базисом для реализации реактивной архитектуры, хорошо сочетаясь с [[Параллелизм (информатика)|параллелизмом]]. | [[Функциональное программирование]] является наиболее естественным базисом для реализации реактивной архитектуры, хорошо сочетаясь с [[Параллелизм (информатика)|параллелизмом]]. | ||
Функциональное реактивное программирование ( | '''Функциональное реактивное программирование (FRP)''' сформировалось в 1997 году, с предложением языка Fran<ref>{{Cite web | ||
|url=http://conal.net/papers/icfp97/ | |||
|title=Functional Reactive Animation | |||
|access-date=2015-09-08 | |||
|archive-date=2020-11-11 | |||
|archive-url=https://web.archive.org/web/20201111235319/http://conal.net/papers/icfp97/ | |||
|deadlink=no | |||
}}</ref>. Позже были разработаны такие языки как Fruit, FRP и RT-FRP, FAL, Frob, Fvision, Yampa<ref>{{статья | |||
|автор = Mun Hon Cheong | |автор = Mun Hon Cheong | ||
|заглавие = Functional Programming and 3D Games | |заглавие = Functional Programming and 3D Games | ||
Текущая версия от 16:51, 1 сентября 2023
Реактивное программирование — парадигма программирования, ориентированная на потоки данных и распространение изменений. Это означает, что должна существовать возможность легко выражать статические и динамические потоки данных, а также то, что нижележащая модель исполнения должна автоматически распространять изменения благодаря потоку данных.
К примеру, в императивном программировании присваивание a = b + c будет означать, что переменной a будет присвоен результат выполнения операции b + c, используя текущие (на момент вычисления) значения переменных. Позже значения переменных b и c могут быть изменены без какого-либо влияния на значение переменной a.
В реактивном же программировании значение a будет автоматически пересчитано, основываясь на новых значениях.
Современные табличные процессоры представляют собой пример реактивного программирования. Ячейки таблицы могут содержать строковые значения или формулу вида «=B1+C1», значение которой будет вычислено исходя из значений соответствующих ячеек. Когда значение одной из зависимых ячеек будет изменено, значение этой ячейки будет автоматически обновлено.
Другой пример — это языки описания аппаратуры (HDL), такие как Verilog. Реактивное программирование позволяет моделировать изменения в виде их распространения внутри модели.
Реактивное программирование предлагалось как путь для лёгкого создания пользовательских интерфейсов, анимации или моделирования систем, изменяющихся во времени.
К примеру, в MVC архитектуре с помощью реактивного программирования можно реализовать автоматическое отражение изменений из Model в View и наоборот из View в Model.
Концепции
Реактивное программирование — это программирование с асинхронными потоками(streams) данных (парадигма программирования, ориентированная на потоки данных и распространение изменений).
Реактивная архитектура позволяет программистам создавать событийно-ориентированные, масштабируемые, отказоустойчивые и отзывчивые приложения — приложения, работающие в реальном времени и обеспечивающие хорошее время реакции, основанные на масштабируемом и отказоустойчивом стеке и которые легко развернуть на многоядерных и облачных архитектурах. Эти особенности критически важны для реактивности.
The Reactive Manifesto
Message Driven (Ориентированность на события)
В событийно-ориентированном приложении компоненты взаимодействуют друг с другом путём отправки и получения сообщений — дискретных частей информации, описывающих факты. Эти сообщения отправляются и принимаются в асинхронном и неблокирующем режиме.
Приложения, использующие асинхронную модель, намного лучше обеспечивают слабую связанность, чем приложения, базирующиеся на чисто синхронных вызовах. Отправитель и получатель могут быть реализованы, не оглядываясь на детали того, как события распространяются в системе.
Событийно-ориентированные системы более склонны к push-модели, нежели чем к pull или poll. Т.е. они проталкивают данные к своим потребителям, когда данные становятся доступными, вместо того чтобы впустую тратить ресурсы, постоянно запрашивая или ожидая данные.
Elastic (Масштабируемость)
The system stays responsive under varying workload (при изменяющейся нагрузке).
Событийно-ориентированная система, базирующаяся на асинхронной передаче сообщений, является основой масштабируемости. Слабая связанность и локационная независимость компонентов и подсистем позволяют разворачивать систему на множестве узлов, оставаясь в пределах той же самой программной модели с той же семантикой. При добавлении новых узлов возрастает пропускная способность системы.
Resilient (Отказоустойчивость)
The system stays responsive in the face of failure.
Событийно-ориентированная модель, которая даёт масштабируемость, также предоставляет необходимые примитивы для решения проблемы отказоустойчивости. Слабая связанность в событийно-ориентированной модели снабжает нас полностью изолированными компонентами, в которых сбои инкапсулируются в сообщения вместе с необходимыми деталями и пересылаются другим компонентам, которые в свою очередь анализируют ошибки и решают, как реагировать на них.
Responsive (Отзывчивость)
The system responds in a timely manner if at all possible (приложения реального времени). Отзывчивый определяется словарём Merriam-Webster как «отвечающий быстро или реагирующий надлежащим образом».
Наблюдаемые модели позволяют другим системам получать события, когда их состояние изменяется. Это обеспечивает связь в реальном времени между пользователями и системами.
Например, когда несколько пользователей работают одновременно над одной и той же моделью, изменения могут реактивно синхронизироваться между ними, избавляя от необходимости блокировки модели. |
Потоки событий образуют базовую абстракцию, на которой строятся такие связи. Сохраняя их реактивными, мы избегаем блокировок и позволяем преобразованиям и коммуникациям быть асинхронными и неблокирующими.
Реактивные подходы к программированию
Императивное реактивное программирование
Можно соединить парадигмы реактивного и императивного программирования. В такой связке императивные программы могли бы работать над реактивными структурами данных.
Объектно-ориентированное реактивное программирование
Объектно-ориентированное реактивное программирование (ООРП) — это комбинация объектно-ориентированного подхода с реактивным. Вероятно, наиболее естественный способ сделать это состоит в том, что вместо методов и полей у объектов есть реакции, которые автоматически пересчитывают значения, и другие реакции зависят от изменений этих значений.
Функциональное реактивное программирование
Функциональное программирование является наиболее естественным базисом для реализации реактивной архитектуры, хорошо сочетаясь с параллелизмом.
Функциональное реактивное программирование (FRP) сформировалось в 1997 году, с предложением языка Fran[1]. Позже были разработаны такие языки как Fruit, FRP и RT-FRP, FAL, Frob, Fvision, Yampa[2].
Простейшее функциональное реактивное выражение имеет следующую форму[3]:
b1 `until` e => b2
что буквально означает «вести себя как b1 до возникновения события e, после этого вести себя как b2».
Реализации
- Elm — функциональный реактивный язык программирования, компилирующийся в HTML, CSS и JavaScript
- Flapjax[en] — событийно-реактивный язык для программирования веб-приложений
- ReactiveX — мультиплатформенная реализация реактивного программирования для Java, JS, C#, Scala, Clojure, Swift и др.
- Reactive.jl — FRP-реализация для Julia
- ObservableComputations — мультиплатформенная реализация для .NET
Примечания
- ↑ Functional Reactive Animation. Дата обращения: 8 сентября 2015. Архивировано 11 ноября 2020 года.
- ↑ Mun Hon Cheong. Functional Programming and 3D Games. — The University of New South Wales, 2005.
- ↑ Paul Hudak. Modular Domain Specific Languages and Tools. — IEEE Computer Society Press, Department of Computer Science, Yale University, 1998. Архивировано 17 октября 2013 года.