前言
身为一名大前端开发人员,在度过了初级开发水平的级别后,是不是经常会有一些困惑:我这代码确实能实现开发需求,但是总感觉有更“优雅”的解决方式,总感觉有些冗余,总感觉可维护性没有那么强,总感觉有些地方有bug但是自己在功能性测试的实操中又测不出来;那么问题来了,有没有总结好的一些方法论,让我们自己测试时更加全面,更加“颗粒化”,让我们代码无论是在可阅读性亦或时可维护性方面得到直观的提升呢?当然有!以前我也不懂,也迷惑,经过了一段时间的学习后,总结出了以下几点,请容我娓娓道来:
这是这个专题的第二篇文章,接 如何编写高质量代码(一) ,如果对您有帮助,可以点波关注,我们共同进步!
2.超级实用之“函数式编程”
2.1 函数式编程的含义:
"函数式编程"是一种"编程范式"(programming paradigm),是一种构建计算机程序结构和元素的风格,它把计算看作是对数学函数的评估,避免了状态的变"化和数据的可变。
简单来说,"函数式编程"作为一种"编程范式",是如何编写程序的一种"方法论"。 它属于"结构化编程"的一种,主要思想是"把运算过程尽量写成一系列嵌套的函数调用"。
意义:
在学习函数式编程之前,我们有必要了解一下从我们开始学习代码就伴随着我们的编程范式,同时也是初学者的老朋友:"命令式编程"。
"命令式编程": 详细的命令机器怎么(How)去处理一件事,已完成你最初的需求(What)。(个人理解,这是我们呆呆代码的指导思想,也是我们代码质量低下、复用、维护性不高的"始作俑者"。)
下面我将用最接地气的方式,体现两者在解决实际问题时的不同,展现函数式编程的魅力,开启你代码“脱胎换骨”的第一步!
命令式编程的局限:
//如果我想得到数组中每一项元素+3后的数组;
命令式编程思想知道下的代码://(呆呆1号代码)
let arr1 = [1,2,3,4,5];
let arr2 = [];
for (let i = 0;i<arr1.length;i++){
arr2.push(arr1[i]+3)
}
console.log(arr2) //[4, 5, 6, 7, 8]
//很显然,这段代码没有任何的复用性,纯靠单一命令实现我们的单一需求;如果我们此时要同时完成对arr1 每项数组分别+3 和 +5,怎么办呢,不可能再写一遍循环吧?
//在命令式编程的指导思想下,我们可以使用函数以完成我们的需求:(呆呆2号代码)
let arr1 = [1,2,3,4,5];
let changeArr = (addNum,arr) =>{
let arr2 = [];
for (let i = 0;i<arr.length;i++){
arr2.push(arr[i]+addNum)
}
return arr2
}
let arr2 = changeArr(3,arr1);
let arr3 = changeArr(5,arr1)
console.log(arr2,arr3) //[4, 5, 6, 7, 8],[6, 7, 8, 9, 10]
//这种方式,比上一个逻辑结构清晰些,复用性高了一点,但是同样“不够灵活!!!”
//如果此时我们需要同时,将这个数组每一项元素+1、每一项元素-2、每一项元素*3+4,得到3个数组,怎么办呢?
命令式编程的思想指导下面对这样的需求就无法优雅的解决问题了,此时,冲出来了一位“帅气优雅”到爆炸的小哥,
他叫“函数式编程”。
函数式编程的魔法:
//这里,不管我们对数组每一项做任何操作,均只需要调用同一个函数。
let arr1 = [1,2,3,4,5];
let changeArr = (arr,fn) =>{
let arr2 = [];
for (let i = 0;i<arr.length;i++){
arr2.push(fn(arr[i])) // you can do anything!!做到 为,为所欲为
}
return arr2
}
let arr2 = changeArr(arr1,(item)=>item*3+5);
let arr3 = changeArr(arr1,(item)=>item-3);
console.log(arr2,arr3) //[7, 10, 13, 16, 19] , [-1, 0, 1, 2, 3]
函数式编程 核心思想的提炼
很显然,在处理同一个问题时,函数式编程最终的复用性,才是我们梦寐以求的为所欲为之复用,怎么做到的呢?
分析:
命令式编程,是将每一步的操作翻译成逻辑代码执行,他一般在复用性方面,是复用传入的参数,但是,对于逻辑改变,他略显无力;
函数式编程,是将我们逻辑中,需要复用的关键步骤进行抽象提炼,比如上方的关键步骤是,对数组中每一项元素,进行一次操作,最终得到一个新的数组,我们是将这一次操作,作为参数传入,做任意操作时只需要传入任意的操作函数作为参数即可实现需求,使得函数灵活性、复用性大大增强!!!完成优雅实现需求的脱胎换骨。
好了,这就是编写高质量代码学习笔记的第二节,如果对你有所帮助,点个小赞支持一下吧~ 之后的章节中会继续详细的介绍如何编写高质量代码的干货,一波关注,共同进步~