代码评审过程中发现以下一段代码:
function color(num) {
if (num <= 5 && num > 0) {
return colorLine[0]
} else if (num > 5 && num <= 20) {
return colorLine[1]
} else if (num > 20 && num <= 40) {
return colorLine[2]
} else if (num > 40 && num <= 60) {
return colorLine[3]
} else if (num > 60 && num <= 80) {
return colorLine[4]
} else if (num > 80 && num <= 100) {
return colorLine[5]
} else if (num > 100) {
return colorLine[6]
}
}
过多的if..else 导致代码看上去比较“丑”。一般优化if...else的方法是通过策略模式,例如:
let map = {
xxx: ()=>{}
}
但这里的if条件是区间判断,就不能直接使用策略模式了。下面重点需要做的是如何将if条件里的区间进行映射,转换成为固定的键值。通过观察可以发现判断条件是有规律的,除了前20,后面的区间相差20,那可以采用除以20,获得的商进行映射,前20和大于100的可以单独特殊处理。
const colorLine= ["(0,5]","(5,20]","(20,40]","(40,60]","(60,80]","(80,100]","(100,..]"]
let map = {
quotient:(num)=>{
if(num<=20){
return num <= 5 ? 0 : 1
}
let quot = Math.ceil(num/20)
if(quot <=5){
return quot
}else{
return '_'
}
},
0: colorLine[0],
1: colorLine[1],
2: colorLine[2],
3: colorLine[3],
4: colorLine[4],
5:colorLine[5],
_:colorLine[6],
}
let num = map.quotient(22)
console.log('num: ', num);
let ans = map[num]
console.log('ans: ', ans);
通过对map.quotient函数调用实现对区间的转换,最终还是可以使用策略模式。最简单的代码功能是不会出现大的问题,但不够优雅,经过简单处理可以提高代码的可读性和可维护性,何乐而不为呢!