前言
身为一名大前端开发人员,在度过了初级开发水平的级别后,是不是经常会有一些困惑:我这代码确实能实现开发需求,但是总感觉有更“优雅”的解决方式,总感觉有些冗余,总感觉可维护性没有那么强,总感觉有些地方有bug但是自己在功能性测试的实操中又测不出来;那么问题来了,有没有总结好的一些方法论,让我们自己测试时更加全面,更加“颗粒化”,让我们代码无论是在可阅读性亦或时可维护性方面得到直观的提升呢?当然有!以前我也不懂,也迷惑,经过了一段时间的学习后,总结出了以下几点,请容我娓娓道来:
这是这个专题的第三篇文章,这里是前文的传送门:
如何编写高质量代码(一) ,
如何编写高质量代码(二)
如果对您有帮助,可以点波关注,我们共同进步!
3.纯函数
3.1 纯函数的含义:
一个函数的“返回结果”只依赖于它的“参数”,无论外界环境如何变化,返回结果均保持不变并且在执行过程里面没有副作用,我们就把这个函数叫做“纯函数”。
3.2 纯函数的特点:
1.相对独立的 – 它容易在代码中移动、重构、重新组织,让程序更灵活,更适应将来的改变。(执行结果不会受外界变化影响)
2.函数执行过程里面没有副作用。(不会影响外界环境)
3.3 应用举例:
//这是一个非纯函数
let adultAge = 18;
let isAdult = (age) => {
return age>=adultAge
}
console.log(isAdult(20))//true
//很显然,这个函数的执行结果依赖于外界变量 adultAge,这样子的函数在使用时执行的结果不完全依赖于函数内部逻辑,adultAge变化时,相同的函数输入无法保证相同的函数输出;
//开发中应尽量编写纯函数,有利于代码模块化、以提升代码的可维护性和灵活性
let isAdult = (age,adultAge) => {
return age>=adultAge
}
console.log(isAdult(20,18))//true
//这样子的纯函数既不依赖于外界变量,又不会影响外界变量,输入代码世界中的独立青年,在模块化开发的世界里,非常的抢手;
//能提高代码的复用性、可维护性和灵活性。
//保证了同样的输出永远会有相同的输出
tips:看到这里,可能你会问,什么是函数的副作用?接下来马上为你介绍。
4.函数副作用
4.1 函数副作用的含义
当调用函数时,被调用函数除了返回函数值之外,还对主调用函数产生附加的影响。(影响了外界变量)
例如,调用函数时在被调用函数内部:修改了全局变量的值、修改函数外界中声明的变量的值(一般通过指针参数实现)等等。
这种副作用显然是不利于模块化开发思想执行的,在开发过程中,可以尽量减少函数的副作用,
控制代码中不确定性
,以提升代码的可维护性、复用性、灵活性,从而提升代码的质量。
那么实际开发中,我们应怎样避免函数的副作用呢?接下来为您介绍:
4.2 如何减少函数副作用(依赖注入)
//比如需求是获取当前时间的字符串格式拼接一句问候:
//非纯的函数一般都会产生函数副作用,例如:
let getRespect = (say)=>{
let cTime = new Date().toISOString();
return cTime+say
}
console.log(getRespect('Good morning~')) //2020-09-16T13:33:24.570ZGood morning~
//上面这段代码虽然完成了需求,但是违背了纯函数原则,相同的输入,并不会带来相同的输出
//所以,为了"控制不确定性",我们可以用到一个小技巧:“依赖注入”(提取函数中不纯的部分作为参数)
let getRespect = (d,say)=>{
let cTime = d.toISOString();
return cTime+say
}
let d = new Date();
console.log(getRespect(d,'Good morning~')) //2020-09-16T13:33:24.570ZGood morning~
这样就保证了函数输出结果只与输入参数有关,减少了代码的不确定性。
同时把不纯的代码移动到了跟小的函数中,使其远离了核心代码,便于集中管理,也让核心代码的行为变得可预测!
4.3 减少函数副作用的常用技巧总结
1.函数入口使用参数运算,但不要修改它;
2.函数内部不要修改函数外的变量;
3.运算结果通过函数返回给外部。
以上就是编写高质量代码学习笔记的第三节,如果对你有一点点帮助,不妨点个小赞支持一下吧~ 之后的章节中会继续详细的介绍如何编写高质量代码的干货,希望我们共同进步~