函数响应式编程(FRP)思想
来源:互联网 发布:北京市java招聘 编辑:程序博客网 时间:2024/04/30 08:21
序
ReactiveCocoa是IOS广为使用的技术框架,而ReactiveCocoa的核心思想就FRP。FRP不同于JAVA的object-oriented和AOP,FRP能让你的代码像数学一样简洁,业务像流水一样清晰流畅。
函数响应式编程
响应式编程思想为体,函数式编程思想为用。
响应式编程
例如,在命令式编程环境中, a:=b+c表示将表达式的结果赋给 a,而之后改变 b 或 c的值不会影响 a。但在响应式编程中,a的值会随着 b或 c的更新而更新。
在响应式编程当中,a:=b+c声明的是一种绑定关系。(a与b、c绑定起来了,所以b、c的变化会影响a,这也就是所谓【变化传播】)
函数式编程
不产生副作用的函数称为纯函数
函数是一等公民=>高阶函数
函数式编程抽取了很多常用操作,作为高阶函数,比如map,filter,reduce。
有了这些函数,你的代码将被大大简化,也意味着你可以进行更加快速的开发,同时这些函数也帮助别人理解你的代码。
Callback风格
客户端开发一个主要组成部分就是监听事件然后更新UI。如下图所示
事件来源包括UI事件、网络回调、生命周期回调,通知等等。更新UI往往需要依赖多个事件以及事件包含的数据。所以我们不得不引入共享状态,如下图所示
为了与FRP区分,可以把这种编程风格叫做Callback风格。
Callback的缺点显而易见:
The code to manage our state and to update our output is ALL over the place.
状态的修改可能分布在很多地方,UI的更新也可能分布在很多地方。
状态之间的组合以及相互影响。并且容易出现Bug,很有可能出现未考虑到的状态组合。
变量式线程同步管理非常复杂。
FRP风格
数据流
在FRP世界里,没有共享状态,定义了一个新的类型——数据流。数据流也是FRP的核心概念。所以有下面这种说法:
FRP is about “datatypes that represent a value ‘over time’”
数据流用图可以表示如下:
Operator
我们对数据流进行操作,比如map、disinct、debounce等等。
Schuduler
FRP还提供了Schuduler,你可以指定你的Operator在哪个线程执行,你的Observer在那个线程监听事件,比如网络请求操作需要在后台线程执行,网络返回之后刷新页面需要在主线程执行。有了Schudeler,就不再需要手动操作线程。
FRP实践
FRP很适合应用于客户端开发。
举个例子:项目中有个需求,根据用户输入金额以及所选择的优惠卷实时计算实付金额。控制流如下图所示:
用IOS中的FRP框架实现如下:
//用户输入金额数据流RACSignal *feeSignal = [[[[payView.fee.rac_textSignal throttle:1.0f]//每秒检测一次 distinctUntilChanged]//去重 map:^id(NSString *text) { return [NSString stringWithFormat:@"%.2f", [text floatValue]]; }] replayLast];//用户选择优惠券数据流self.couponSignal = [[[RACReplaySubject subject] distinctUntilChanged] replayLast];//实时计算支付金额数据流[[[[[RACSignal combineLatest:@[self.feeSignal, self.couponSignal]//组合 reduce:^id(id paramA, id paramB){ //构建网络请求参数 }] distinctUntilChanged] map:^id(id params) { //网络请求 return [XXNetService queryXX:params]; }] switchToLatest]//取消之前的计算请求,发起最新的计算请求 subscribeNext:^(NSNumber *x) { //显示请求结果 }];
所以,代码基本上就是流程的直接映射,就像照镜子,如下图所示。
并且,代码逻辑集中。
而使用Callback风格,维护状态让人焦头烂额,如下图所示。
FRP优势:
可读性
- 代码逻辑更加集中- 减少共享变量,减少出错率- 框架分步,流程清晰
复用性
- 丰富的高阶函数
参考链接
why reactive(cocoa)
input and ouput
- 函数响应式编程(FRP)思想
- 函数响应式编程(FRP)框架--ReactiveCocoa
- 函数响应式编程(FRP)框架--ReactiveCocoa
- 函数响应式编程(FRP)与 ReactiveCocoa
- ReactiveCocoa RAC 响应式函数编程(FRP)
- ReactiveCocoa 框架 (一)-- 函数响应式编程(FRP)框架
- 几种编程思想(链式编程、响应式编程、函数式编程)
- 游戏编程的未来 —— FRP(函数式反应型编程)
- 【Scala】响应式编程思想
- 响应式编程思想(一)
- 函数式编程思想
- 函数式编程思想
- 函数式反应型编程(FRP) —— 实时互动应用开发的新思路
- 函数式反应型编程(FRP) —— 实时互动应用开发的新思路
- 函数响应式编程
- 响应式函数编程
- 函数式编程的思想
- RxSwift 函数响应式编程
- 时间序列分析
- android.os.SystemProperties和android.os.Environment
- 程序员薪水差距在哪里?
- bzero()与 memset()等的区别
- javascript dom-文档结构和遍历
- 函数响应式编程(FRP)思想
- 双边滤波算法数学模型分析
- 小雷的冰茶几——并查集
- 浅析JVM 第三篇(堆内存参数调整)
- Linux命令
- 转载
- React使用ES6和ES5写法对比
- Android ExpandableListView使用小结
- Gym