函数式编程的核心价值是什么

Yang 333

函数式编程的核心价值在于它将计算视为数学函数的求值,避免使用可变数据和复杂的状态维护,从而带来了易于维护、并行编程的开发体验,具有很重要的意义。函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。

一、函数式编程的核心价值

函数式编程的核心价值在于它将计算视为数学函数的求值,避免使用可变数据和复杂的状态维护,从而带来了易于维护、并行编程的开发体验,具有很重要的意义。函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。函数式编程注重干什么而不是怎么干,更容易理解。函数式编程不依赖、也不会改变外界的状态,只要给定输入参数,返回的结果必定相同。因此,每一个函数都可以被看做独立单元,很有利于进行单元测试 (unit testing)和除错 (debugging),以及模块化组合。

二、函数式编程的概念

1、概念

维基百科定义:

函数式编程(英语:functional programming),又称泛函编程,是一种编程范式,它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象

它属于”结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用

2、前端中函数式编程的定义

在前端开发中,主要开发语言是javascript,而js自身并不是函数式编程语言,也就没有一个明确的定义。

在前端开发中,通常使用FP 通过声明纯函数抽象数据的处理,来避免或尽可能减少函数调用对于外部状态和系统产生的副作用,这样一种思想称为函数式编程

三、函数式编程在前端的应用

1、框架层面的应用

1.1 React函数式编程

函数式编程时react框架设计的核心思想之一,每个组件其实都是一个函数,对这些函数进行组合之后形成data和view之间的映射关系,React自身可以看作是一个ui函数,入参是data

例子:

dom函数化(jsx),react算法中的尾递归,尾调用,fiber生成算法,hooks等

1.2 vue3函数式编程

vue3新增了一个新的函数setup,类似于react的hooks

1.3 Redux函数式编程

redux是函数式编程在解决前端数据流中很典型的应用。

中间件机制(compose),纯函数Reducer,createStore(enhancer)等

1.4 Rxjs函数式编程

Rxjs是一个解决复杂异步操作的库,结合了响应式编程和函数式编程。

1.5 koa中的函数式编程

中间件的实现compose

1.6 lodash中的函数式编程

lodash中的fp模块

2、在单元测试中的应用

严格函数式编程的每一个符号都是对直接量或者表达式结果的引用,没有函数产生副作用。对被测试程序中的每个函数,只需在意其参数,而不必考虑函数调用顺序,不用谨慎地设置外部状态。所有要做的就是传递代表了边际情况的参数。如果程序中的每个函数都通过了单元测试,软件系统的质量就有了保证

3、在es6之后的应用

箭头函数

数组的扩展 find findIndex

Map数据结构

Reflect映射

对象的链判断运算符(MayBe函子) message?.body?.user?.firstName

函数扩展 尾调用优化

最新提案:函数的部分执行

gua管道运算符 >|

4、允许可控制的副作用共存

前端可能的副作用

更改全局状态

发送一个 http 请求

可变数据

打印/log

获取用户输入

DOM 查询

访问系统状态

在无法避免副作用的情况下,使用函子和单子来控制副作用,也包括错误的处理。

许多异步解决方案其实是函子的具体实现,比如Promise是一个Monad

四、函数式编程的优势

1. 代码简洁,开发较快

函数式编程大量使用函数,功能抽离,减少了代码的重复,代码复用性高,因此程序比较短,开发速度较快。

2. 易于理解,接近自然语言

用描述性的表达式组合不同的函数形成程序,易于理解

比如:(1 + 2) * 3 – 4 <——-> subtract(multiply(add(1,2), 3), 4)

3. 易于代码的维护和管理

函数式编程不依赖、也不会改变外界的状态,只要给定输入参数,返回的结果必定相同。每一个函数都可以被看做独立单元,很有利于进行单元测试(unit testing)和除错(debugging),以及模块化组合。

4. 易于”并发编程”

函数式编程不需要考虑”死锁”(deadlock),因为它不修改变量,所以根本不存在”锁”线程的问题。不必担心一个线程的数据,被另一个线程修改,所以可以很放心地把工作分摊到多个线程,部署”并发编程”(concurrency)

5. 易于代码升级和扩展

函数式编程没有副作用,只要保证接口不变,内部实现是外部无关的。

回复

我来回复
  • 暂无回复内容

注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部