Skip to content

函数式编程的理解

专题简介

  • 编程范式
  • 函数式编程是什么
  • 特点
  • 优缺点

如何理解编程范式

编程范式是一种编程风格或思维方式,描述了解决问题的方法和模式。不同的编程范式强调不同的编程原则和理念。

编程范式分类

  • 面向过程编程(Procedural Programming):
  • 面向对象编程
  • 函数式编程
  • 声明式编程
  • 命令式编程
  • 逻辑编程
  • 并发编程
  • 泛型编程

函数式编程是什么

函数式编程是一种"编程范式"(programming paradigm),一种编写程序的方法论,以函数作为主要载体的编程方式,用函数去拆解、抽象一般的表达式

函数式编程的特点

1. 函数是一等公明

你可以像对待任何其他数据类型一样对待它们——把它们存在数组里,当作参数传递,赋值给变量...等等。使用总有返回值的表达式而不是语句

2.纯函数

相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用。

副作用:是指,函数内部与外部互动,产生运算以外的其他结果。 例如在函数调用的过程中,利用并修改到了外部的变量,那么就是一个有副作用的函数。

  • 引用透明(无状态): 函数的的运行结果不依赖全局变量,this 指针,IO 操作等,只依赖于输入的参数,任何时候只要参数相同, 引用函数所得到的返回值总是相同的。
  • 没有副作用(数据不变): 不修改全局变量,不修改入参。

3.基于表达式

也称为声明式编程,不再指示计算机如何工作,而是指出我们明确希望得到的结果。与命令式不同,声明式意味着我们要写表达式,而不是一步一步的指示。

  • 命令式代码:命令“机器”如何去做事情(how),这样不管你想要的是什么(what),它都会按照你的命令实现。
  • 声明式代码:告诉“机器”你想要的是什么(what),让机器想出如何去做(how)。

4.无状态和数据不可变

  • 数据不可变: 它要求你所有的数据都是不可变的,这意味着如果你想修改一个对象,那你应该创建一个新的对象用来修改,而不是修改已有的对象。
  • 无状态: 主要是强调对于一个函数,不管你何时运行,它都应该像第一次运行一样,给定相同的输入,给出相同的输出,完全不依赖外部状态的变化。

5.惰性执行

函数只在需要的时候执行,不产生无意义的中间变量。从头到尾都在写函数,只有在最后的时候才通过调用 产生实际的结果。

常见的函数式编程模型

  • 闭包(Closure):函数 + 函数体内可访问的变量总和
  • 高阶函数:通过接收其他函数作为参数或返回其他函数的函数
  • 柯里化:把接受多个参数的函数转换成接受一个单一参数的函数
  • 函数组合:将多个函数组合成一个函数。

函数式编程的优缺点

优势

  • 更好的管理状态:因为它的宗旨是无状态,或者说更少的状态,能最大化的减少这些未知、优化代码、减少出错情况
  • 更简单的复用:固定输入->固定输出,没有其他外部变量影响,并且无副作用。这样代码复用时,完全不需要考虑它的内部实现和外部影响
  • 更优雅的组合:往大的说,网页是由各个组件组成的。往小的说,一个函数也可能是由多个小函数组成的。更强的复用性,带来更强大的组合性
  • 隐性好处。减少代码量,提高维护性

缺点

  • 性能:函数式编程相对于指令式编程,性能绝对是一个短板,因为它往往会对一个方法进行过度包装,从而产生上下文切换的性能开销
  • 资源占用:在 JS 中为了实现对象状态的不可变,往往会创建新的对象,因此,它对垃圾回收所产生的压力远远超过其他编程方式
  • 递归陷阱:在函数式编程中,为了实现迭代,通常会采用递归操作。