Rx

为什么使用Rx

Posted by boredream on April 20, 2021

网上很多讨论「怎么用」的,这里尝试从「为什么用」的角度思考

相关概念

响应式编程

介绍 WIKI

与命令式编程相对应
命令式 a = b + c 得到a的值,之后b、c改变和a无关。
响应式 b + c -> a 后续b、c的变化都会引起a改变。

函数式响应式编程

介绍 WIKI
用函数(map、filter等)实现响应式编程

Reactive Extensions

介绍 WIKI
Rx 官网
也叫 ReactiveX / Rx,是一个使用可观察数据流进行异步编程的接口。

支持多种语言,包括RxJava/RxJs/RxSwift等。

为什么用Rx

RxJava Essentials 中文GitBook
响应式编程,是明智的选择
响应式编程入门:实现电梯调度模拟器

Rx = 响应式 + 函数式 + 离散事件推动 + 观察者模式 + 异步

  1. 思想上,响应式或命令式只是不同角度,都可以实现开发。但对于常规数据驱动视图的应用来说,响应式更符合。从SwiftUi、JetPack Compose也可以看到趋势。
  2. 虽说思想上都走得通,但Rx这种具体的实现方案,提供了各种便捷的函数(map、filter、zip等)更有利于实际开发。
  3. 对于简单场景,普通回调等也可以满足需求。但当有多个异步任务,需要以复杂的规则组合在一起后最终得出结果,这样的场景下Rx就更合适了。

思考

前面其实是探讨为什么用ReactiveX,但响应式和命令式更本质的区别还有待继续研究思考。

可以以MVVM和MVC MVP的区别作为切入点思考下。MVC和MVP是处理完数据后,再「命令」视图修改成如何如何,但MVVM这种是先建立好视图和数据的「关系」,之后只要在某个时间更新数据,与之绑定的视图就会自动更新了。前者是先处理数据再找视图,后者是先绑定数据和视图的关系再修改数据。这就是响应式的概念,不过MVVM是聚焦于数据和视图间的响应,此外还可以只对数据进行响应式处理。

最后抛开代码,但从思维上考虑:
如果源头是经常变化,但源头到结果的关系是恒定不变的,则响应式的思维更合适;
如果源头到结果的关系是经常变化的,则命令式的思维更合适;

以造东西为例,响应式就是批量制式造东西,即使输入了不同的材质,铁、橡胶等,最后都以相同的逻辑,先切割成ABC三个不同形状零件,再合并到一起完成,这套制造规则是在输入原材料前就定好的。而命令式就相当于雕刻玉,对不同的玉石材质,需要针对纹路形状大小等以不同手法雕刻成型,处理方法是在拿到材料后才决定的。

而对于大部分程序来说,本身就为了处理重复工作的,规则都是先定好的,只有输入会不停变化,因此响应式从这个角度来看天然的更适合于程序开发。