面向对象编程(OO)通过封装变化使得代码更易理解
函数式编程(FP)通过最小化变化使得代码更易理解
当考虑应用设计时,你应该问问自己是否遵从了以下的设计原则:
- 可拓展性——我是否需要不断地重构代码来支持额外的功能?
- 易模块化——如果我更改了一个文件,另一个文件会不会受到影响?
- 可重用性——是否有很多重复的代码?
- 可测性——给这些函数添加单元测试是否让我纠结?
- 易推理性——我写的代码是否非结构化严重并难以推理?
函数式编程的基本概念:
- 声明式编程
- 纯函数
- 引用透明
- 不可变性
什么是函数式编程
函数式编程的目标是使用函数来抽象作用在数据之上的控制流与操作,从而在系统中消除副作用并减少对状态的改变
函数式编程是声明式编程
声明式编程是一种编程范式,它会描述一系列的操作,但并不会暴露它们是如何实现的或是数据流如何穿过它们。
例如,计算一个数组中所有数的平方:
1 | [0, 1, 2, 3, 4, 5, 6].map(num => Math.pow(num, 2)) |
副作用带来的问题和纯函数
副作用例子:
- 改变一个全局变量、属性或数据结构
- 改变一个函数参数的原始值
- 处理用户输入
- 抛出一个异常,除非它又被当前函数捕获了
- 屏幕打印或记录日志
- 查询html文档、浏览器cookie或访问数据库
纯函数性质:
- 仅取决于提供的输入,不依赖于任何在函数求值期间或调用间隔时可能变化的隐藏状态和外部状态
- 不会造成超出其作用域的变化,例如修改全局对象或引用传递的参数
引用透明
如果一个函数对于相同的输入始终产生相同的结果,那么就说它是引用透明的
函数式编程的优点
- 促使将任务分解成简单的函数
- 使用流式的调用链来处理数据
- 通过响应式范式降低事件驱动代码的复杂性
这种编程范式使用了一个叫做observable的概念,observable能够订阅一个数据流,让开发者可以通过使用组合和链式操作来优雅的处理数据
总结
- 使用纯函数的代码不会更改或破坏全局状态,有助于提高代码的可测试性和可维护性
- 函数式编程采用声明式风格,易于推理,提高了程序的可读性,通过使用组合和lambda表达式使代码更加精简
- 集合中的数据处理可以通过链接如map和reduce这样的函数来实现
- 函数式编程将函数视为积木,通过一等高阶函数来提高代码的模块化和可重用性
- 可以利用响应式编程组合各个函数来降低事件驱动程序的复杂性