PART 3 - Taming the sequence
Side effects
本章将讨论引入使用可观测物队列时的副作用。如果一个方法被认为有副作用,那么它除了返回任何值,还有其他一些可观测物效果。一般的可观测物效果是一个状态上的修改。这种可观测物效果可能是:
比方法具有更广的变量修改范围(如全局、静态、或者可能是一个参数)
I/O,比如读写一个文件
更新显示
函数式编程一般试图避免产生任何副作用。具有副作用的方法,特别是修改状态,需要程序员理解的不仅仅是方法的输入和输出,还需要理解过程和状态修改的context。这大大的增加了函数的复杂性,使它更加难以正确理解和维护。
副作用并不总是偶然的,也并不总是有规律的。一个简单的减少意外的副作用的方法是为变化减少成员的暴露。简单的actions coders可以减少状态的能见度或者范围,并可以使你一成不变。你可以通过将它放到一个代码块中,例如一个方法来降低一个变量的能见度。通过使它们私有或受保护可以减少类成员的可见度。根据定义不可变性数据不能被修改,所以就不会有副作用。这些都是明智的封装规则,可以提高RX代码的可维护性。
下面的例子演示了副作用,将输出元素的index和值,接受更新变量(闭包)
Output:
Received A at index 0
Received B at index 1
Received C at index 2
completed
虽然这看起来挺无害的,但如果其他人把这当成了团队的要求而也这样写,就会引发更多的问题。下面我们将在之前的例子的基础上添加一个重复的订阅:
Output
Received A at index 0
Received B at index 1
Received C at index 2
completed
Also received A at index 3
Also received B at index 4
Also received C at index 5
2nd completed
可以从上面中看到,第二个订阅的输出的index与我们预期并不一样。副作用除了产生不可预知的结果,更难以测试和维护,尤其是在异步和并发方面。
Composing data in a pipeline
捕获状态的首选方法是将其引入管道。理想的情况下,我们希望管道的每个部分都是独立的和确定性的。也就是说,每个函数组成的管道应该有其输入和输出作为其唯一状态(就像现实中的管子一样)。为了纠正我们的例子,我们可以修饰管道中的数据,消除它的共享状态。这将是一个很好的例子,我们可以使用Select方法重载来暴露index。
Output:
Received A at index 0
Received B at index 1
Received C at index 2
completed
Also received A at index 0
Also received B at index 1
Also received C at index 2
2nd completed
还可以使用其他功能,如Scan来达到类似的结果。这里是一个例子:
关键是分离状态,减少或者消除任何像状态变异的副作用。
暂无关于此日志的评论。