目录
概念
面向流设计
异步化
响应式宣言
参考文档
概念
Reactive Programming(响应式编程)已经不是一个新东西了.
关于 Reactive 其实是一个泛化的概念, 由于很抽象, 一些理论性的介绍很容易把人带到沟里去, 包括一些语言框架在实现上也会使用不同的一些概念.
按照 维基百科的解释:
reactive programming is a declarative programming paradigm concerned with data streams and the propagation of change
意思就是, Reactive Programming 就是一种面向数据流, 关注变更的声明式编程范式.
面向数据流比较容易理解, 而关注变更则说的应该是数据流的特点, 比如来自某个界面元素属性的变更(前端领域), 又或是某个后端实体的更新事件(日志)..
以下面的这个函数为例:
c = a + b;
这里定义了变量 c 是 变量 a, 变量 b 之和, 当 a=1,b=2 时, c 的值就是 3.
假设我们在程序中执行了这个语句, 那么对于一次执行过程所产生的 c 的值就是确定的(上下文中的 a,b 变量也是确定的)
但是, 如果 a,b 的值是不确定的呢? 即这个语句仅仅是定义了变量 c 与 变量 a,b 的计算关系, 那么 c 的值就是可变的!
如下:
- a=1,b=1,c=2
- a=2,b=2,c=4
- a=3,b=2,c=5
- ...
简言之, c 需要动态的由 a,b 共同来决定:
当 a,b 的值发生变化时, c 的结果要能及时的做出响应(或者叫反应), 以此来保证正确性.
这应该就是 Reactive(响应式) 的由来了, 由于变量 a,b 的值可能会不断的变化, 于是会形成持续不断的变更事件, 也就是事件流, 因此 Reactive 是面向流式处理来设计的.
此外, 在处理这种 "变更的流" 时, 通常是由异步通知的方式来完成, 因此异步化也是其特征之一.
从现有的一些 Reactive 框架来看, 关于下面的定义则更加的贴切:
Reactive 编程 是面向数据流的, 异步化的编程范式
图 - Reactive-Proactive
与 Reactive 相对的是 Proactive , 后者是一种同步的, 轮询式的处理方式
面向流设计
首先, 有别于面向对象编程的思想, 在 Reactive 范式里面, 所有的东西都可以当做流, 即 Everything is Stream.
流(Stream) 被作为响应式编程的基本元素, 这和其他的编程范式非常类似:
面向对象设计, 基本单位是对象
面向函数设计, 基本单位就是函数
响应式设计, 基本单位就是流..
那么流是什么样的东西呢?
可以是 用户输入, 数据结构, 缓存, 动态变量... 等等!
可以来自 静态的数据集合, 或是动态的事件流.
案例: MVC
MVC(Model-View-Controller) 是前端设计的标准, 这也是用来说明 "面向流" 的一个很好的例子.
图 - MVC
其中, 来自于用户的点击操作, 会被转换为各种事件传递给 Controller 进行处理.
在这里, 我们可以认为这些持续不断的事件形成了 "事件流". 比如一个按钮的点击事件流如下图:
在这里, 事件流是按时间排序进行处理的. 但你可能会说, 这不就是简单的一个事件处理机制嘛?
别着急, 基于响应式流可以做更多的事情, 如下图:
上图的每个灰框代表了一个处理方法:
buffer(stream.throttle(250ms)),buffer 就是缓冲, 而 throttle 是节流.
这个函数的意思就是对流进行缓冲处理, 将 250 毫秒范围内发生的事件合并到一起.
map('length of list'), 将合并后的列表进行转换, 输出为每个列表的长度
filter(x>=2), 即按照>=2 的条件进行过滤.
当然, 使用传统的编程方式也完全可以实现这些逻辑, 只是相比之下基于响应式流的处理会更加的优雅, 所用代码也会更少.
- the-hollywood-principle(好莱坞原则)
- https://dzone.com/articles/the-hollywood-principle
来源: https://www.cnblogs.com/littleatp/p/11386487.html