[关闭]
@Loong-T 2015-07-21T06:39:28.000000Z 字数 1946 阅读 1536

草稿 - Reative Programming 基础

了解基础知识对理解有帮助,这部分偏理论。而且个人理解有限,整理可能有误,所以了解一下就够。

响应式编程

Reactive programming,响应式编程,是来自于函数式编程范式的一种编程模型。Functional reative programming(FRP)特别适合应用于异步或强交互 GUI 编程中。

按照 Martin Odersky(Scala 之父)的课程 Principles of Reactive Programming 所说,响应式编程有四个特点:

  1. Event-driven:事件驱动
  2. Scalable:扩展性
  3. Resilient:适应性,指从错误中恢复的能力
  4. Responsive:响应性,对用户的响应

前三条是实现第四条的基础。

对应到 RxJava 上来:Observable 是从 event 构建的;使用操作符 Operator 可以对 Observable 进行非常灵活方便的扩展;onError() 会收集过程中产生的所有错误。

观察者模式

Rx 是基于观察者模式的,对异步编程有很好的支持,可以回避 callback hell 以及大量的 try catch 块。对应到同步编程上,是迭代器模式:

An Observable is the asynchronous/push “dual” to the synchronous/pull Iterable

event Iterable (pull) Observable (push)
retrieve data T next() onNext(T)
discover error throws Exception onError(Exception)
complete !hasNext() onCompleted()

Iterable:

  1. getDataFromLocalMemory()
  2. .skip(10)
  3. .take(5)
  4. .map({ s -> return s + " transformed" })
  5. .forEach({ println "next => " + it })

Observable:

  1. getDataFromNetwork()
  2. .skip(10)
  3. .take(5)
  4. .map({ s -> return s + " transformed" })
  5. .subscribe({ println "onNext => " + it })

Monad

Monad 是函数式编程中非常重要的一种抽象数据结构。比较抽象,我也没理解完全,所以只能简单介绍下。下面的知识点大部分来自于 Principles of Reactive Programming。

Monad 是遵从一定的代数原则的数据结构,通常来说会有两个方法:flatMap 和 unit。

对于一个名为 M 的 monad,类型为 M<T>,有:

  1. public M<U> flatMap<U>(T -> M<U>);
  2. public M<T> unit<T>(T);

Monad laws 是用于鉴定一个类型是否是 monad 的原则,并且也用于指导如何使用 monad。看看就好。

Monad Laws:

  1. Associativity 结合律:m flatMap f flatMap g == m flatMap (x => f(x) flatMap g)。整数是一种 monad 的特例,称为 monoid,结合律就比较容易理解了。
  2. Left unit:unit(x) flatMap f == f(x)
  3. Right unit:m flatMap unit == m

如果还定义了 withFilter 方法,monad 被称为 monad with zero。

关于 flatMap

深入浅出RxJava(二:操作符)中提到,flatMap 是最难理解的部分。

通常来说 map 操作符更为常用,map 的类型签名:public M<U> map<U>(T -> U)。(Map 是使用 flatMap 实现的 m.map(f) == m.flatMap(x -> unit(f(x)))。)

对比 flatMap 签名 public M<U> flatMap<U>(T -> M<U>) 可知,两个方法的不同在于传入的方法参数不同。

两个方法返回的类型都是 Observable<T>,但 map 传入的方法参数是 T -> U,将 event 从 T 类型转换为 U 类型,然后返回的是包含了所有 U 类型 event 的 Observable。

flatMap 传入的方法参数是 T -> Observable<U>,将每一个 T 类型的 event 都分别包装成 Observable 返回。

简而言之,对一个 Observable 进行 map 返回的是一个 Observable,而对一个 Observable 进行 flatMap 可以返回多个 Observable。

参考

游戏编程的未来——FRP(函数式反应型编程):这种编程范式面向和关注数据流和变化的扩散,它可以方便的建立动态的数据流,其底层机制会让数据流的变化自动扩散到相应的逻辑。

异步编程与响应式框架

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注