所谓的函数式编程,类似数学上的函数,也就是确定的输入有确定输出。函数式编程中没有侧边效应,所以函数式编程是测试的,那么什么是侧边效应呢?侧边效应这个词,个人也了解一段时间才明白其内在意义,这里举一个小例子来帮助大家了解侧边效应(side effects)。
妈妈给小明钱去买酱油,这就是一个函数式编程,输入 money 而输出是酱油。当然有关函数式编程对异常处理,我们以后再探讨。先不考虑异常,异常可能是钱掉了或酱油洒了导致没有输出。好有了故事背景,那么什么是侧边效应,小明去买酱油的途中去游戏厅完一把游戏,玩游戏这件事这就是侧边效应。
side effect 也是副作用的意识,在生病时服药,药物上都有提示服用这种药需要注意什么,会有什么副作用。当然我们不希望有任何副作用。所以即使在我们平时 OOP 时也要尽可能考虑减少副作用,让我们的类或函数职能单一。
当下流行的编程是 immutable 编程,有关 immutable 具体如何翻译,这里我个人也是逐步随着学习而逐渐深入了解这个词的含义。这里暂时就直接用英文,不给予个人理解的翻译了吧。
想了想还是翻译成"不可变的",如果我们创建一个数据,数据集合,这个数据在整个应用不可变的,也就是他确定的。那就少了许多麻烦。但是世界是变化的。是 mutable。immutable 其实在每次修改对象时,不是修改对象的本身,而是将数据复制一份将现有数据保存,副本上修改数据生成一个全新的对象。或是理解每一次不是修改,而是创建一个全新的对象,并且修改对象。这样好处不然而喻了,我们的数据是可以 undo 和 redo 的。良好的追溯性。
其实无论是生活还是工作我们都希望一切都是根据我们期望的发展,也就是可以预判,我们经过努力就可以成功。不过世界是多变的,我们是无法预知未来的。即使我们通过跟种各样理论让我们预测无限地接近未来,我们也只是接近。那么好 如果我们的程序是确定性,起码我们把确定性那部分拿出来,然后专注去控制不确定性。程序就会 better。
纯函数是更趋近于 map ,将一种类型的数据转换为另一种数据,其实这也是函数的本质。所以在纯函数中对于输入输出确定性 测试结果正确done 简化测试 组合有效 modify 来共享内存 危险 jinzheng和难debug 如果是 全速不存在
我们可以让 javascript 也成为支持 immutable 编程的语言,那么就需要将那些支持 mutable 方法移除来使 javascript 成为 immutable 语言。
1. 首先我们要移除的 Date ,因为每次调用他的返回值是不确定, 同样 Math.random 也会返回一个不确定的随机数,所以他们都不适合纯函数编程。
2. 这里我们移除 delete 操作符,因为 delete 可以修改 object 的属性,所以没有必要在纯函数中保留 delete。
3 Object.assign 这个在 OO 中没做扩展对象或者是实现继承的操作符。由于类似方法可能会修改对象,所以他们将不会出现在 immutabl 纯函数编程中。
4. 我们再来看一看 Array.splice 这个方法会修改我们的数组,而 slice 则不会破坏原有 Array 而修改后重新创建一个 Array。
所以我们去掉 splice 而保留 Array.slice 。
5. 同样由于 sort 方法也会修改 Array 所以当然这不是我们希望的所以也移除他
6. 同样因为 RegExp.exec 因为会修改对象所以不再保留他。
6. for 循环我们也不需要,原因
7. 当然 var 和 assignment 这样赋值符号我们也不再需要了,他们会改变对象,我们不希望改变希望的是海枯石烂。
8. user ,当然用户是善变的,所以我们在 immutable 编程中也不需要用户。
9. network 同样是不确定的,相同的请求,返回的结果不是确定。所以我们也把他归类 mutable 而从 Immutable 编程剔除。