尽管函数式编程定义尚有争议, 有一些基本一致的观点
• First-class函数, 可以接受函数作为参数或返回一个函数
• 纯函数, 副作用一般指io, 读写全局变量的值这样的纯运算以外的操作, 纯函数更容易测试, 可读性更好
• Pattern matching, 省去大量的check和取值的代码, 可读性更好
• 惰性求值, 省去不必要的运算和io等, 其实许多运算都没有必要, 编译时不知道有没有必要, 根据运行时的情况, 有可能就变得没有必要
• 递归, 许多人认为递归会影响性能并且可能栈溢出, 尾递归解决了这些问题
• 不可变变量, 变量不可变, 意味着不会存在对外可见的中间状态, 也可以改善全局状态的更新问题,
我们知道变量不可变, 那么发现问题变量时就可以断定变量来自哪部分运算或来自参数传递, 这样调试更容易
Pure Functions
Null为什么不好?
Null使我们可以表示没有值,但是使用它会导致许多问题.
比如我们调用函数getCustomerById得到一个返回值Null,
调用方该怎么做? 这个Null表示出错了? 还是说没有找到值? 该不该有值? 接下去怎么办?
考虑一下有多少地方需要做Null判定, 漏了一处就会有NullPointerException,
每每想到这里我就会想到Haskell的Maybe类型, Clojure的Option类型, erlang的速错思想
另外也有一个做法是返回一个空列表(适用于本来返回值就是列表的情况),
这样对于上层来说是相同的,都是列表,只是有没有元素的区别
消息传递
减小了进程间的关联性, 收消息做运算, 运算完发完消息就跟本进程没关系了,
减少了需要使用锁的场合, 于是提高了并发性
没有空指针问题
函数式编程的一点体会, 命令式编程里变量只是个名字,里面是什么值,有没有值都不好说,
没有值是什么情况?空指针呗,没有分配内存空间才会这样,如果分配内存了就有值
而函数式编程里变量就是值,不会再变,一定有值,不会是空指针,是什么值也是确定的