查漏补缺——前端常用编程范式

24 阅读3分钟

命令式编程

命令计算机去做事情,注重过程,一步一步的进行代码描述,不管需要实现什么样的功能,都会按照命令完成

// 第一步创建一个数组
let numbers = [1,2,3,4,5]
// 第二步创建一个新的数组
let doubled = []
// 第三步遍历数组将元素处理后推入新的数组
for(let i = 0; i < numbers.length; i++) {
  var newNumber = numbers[i] * 2
  doubled.push (newNumber)
}
console.log (doubled) //=> [2,4,6,8,10]

命令式编程的典型应用是JQ 命令式编程的优点是直接操作目标,性能在一定程度上优于函数式编程,但是代码可维护性和可复用性较差

声明式编程

声明式编程只关注于结果,不关注实现的过程

var numbers = [1,2,3,4,5] 
var total = numbers.reduce (function (sum, n) { 
    return sum + n 
}); 
console.log (total) //=> 15
// 不用关注reduce的具体实现方法,只需要传入参数就能得到累加的结果

面向过程编程

面向过程编程属于命令式编程的一种实现

面向对象编程

面向对象编程也是命令式编程的一种实现,面向对象的特点是封装、继承和多态 在JS中,面向对象编程把逻辑与数据封装到函数与原型中,通过函数的原型链拷贝实现继承,而代码的运行逻辑与数据依然封装在函数内,但是做了属性与方法的区分

函数式编程

函数式编程是声明式编程的一种实现

把逻辑完全视为函数的计算。把数据与逻辑封装到函数中,通过对函数的计算,加工,处理,来生成新的函数,最后拼装成一个个功能独立的函数。在运用这些函数,完成复杂逻辑的实现

与现象对象不同的是,数据和逻辑封装到函数中而不是类与对象中。每个函数完全独立,好的函数式设计,每个函数都是一个纯函数(即输入固定参数,即可得到相同输入的函数)。优点是:

  • 面向对象中的任何一个原型方法都会获得this的数据,而且可以轻易获取闭包的数据。这样的非纯函数非常难以提炼与抽象
  • 纯函数由于输入与输出固定,所以非常容易单测。好的函数式中的函数设计,不会依赖于任何其他函数或者声明配置,只需要传递参数,既可以进行测试。而在面向对象语言中,往往需要启动整个工程,或者说所有依赖的类全部要加载,才能开始测试
  • 对逻辑做抽象与提取,让我们避免在函数内做判断与循环,我们只需要把具体处理封装到函数中,而程序运行过程中的走向、判断与循环通常交给底层框架来处理,例如react和vue

参考文章

函数式编程

函数式编程(FP)

llh911001/mostly-adequate-guide-chinese

JavaScript: 函数式编程 - 声明式函数