一个项目中间的间歇阶段,给自己增加一点知识储备,认真读一本技术书。
今次我们来读这本函数式编程指南。
第一章,主要讲解的是函数式编程的思想和基本概念。
1)编程的几大要素决定了程序的质量:
可扩展性(泛用)
易模块化(弱耦合)
可重用性(合并类似代码)
可测性
可推理性(可读)
2)函数式编程的目标
使用函数来抽象作用在数据之上的控制流与操作,从而在系统中消除副作用并减少对状态的改变。
3)命令式,过程式,声明式编程
命令式:最常用的,把指令步骤输入
声明式:把描述和求值分离。用表达式来阐述逻辑。
函数式编程旨在提高函数的无状态性和不变性。循环时一种很难修改并重复使用的代码
4)纯函数
如果函数的调用参数相同,则永远返回相同的结果。它不依赖于程序执行期间函数外部任何状态或数据的变化,必须只依赖于其输入参数。
该函数不会产生任何可观察的副作用,例如网络请求,输入和输出设备或数据突变(mutation)。
符合以上条件的函数,就是纯函数
请理解,函数式变成不是让你全写纯函数,而是把能作为纯函数的部分提取出来。减少可变性的影响
5)柯里化作用
将交互从主逻辑中分离,使其更易于管理,常用柯里化
6)引用透明
如果一个函数,对相同输入始终有相同结果,说明其引用透明
7)储存不可变数据
js中的引用数据即使在函数中,也是可变的。所以推荐使用map而尽量不要用foreach
8)函数式本质
将复杂函数分解组合
9)链式结构有利于程序的执行
但是错误处理是一大难点,将在后续章节中存在解决方案,我们先去看一看(使用MONAD)
10)如何处理用户输入,web请求,文件系统或基于异步的操作?
响应式编程。这是啥? 订阅者模式处理数据。
11)js的缺点
js的本质是对象。然而对象采用引用式导致很难控制其不可变性
采用Object.freezen 可进行浅锁定。
书中推荐采用Ramda.js的js函数库
12)闭包
围绕函数定义的静态作用域或词法作用域
闭包作用:模拟私有变量
服务端异步调用
模拟作用域变量