1、如何用策略模式去优化我们的项目代码?
举例子:现在有一段程序,需要根据员工的绩效和他的基础薪资去计算年终奖
原始代码如下:
/* 计算年终奖
* @params level 员工绩效等级
* @params salary 员工月薪
* return 年终奖金
*/
function rewardCalc(level, salary){
if(level === 'S') {
return salary * 4 // 这里的处理逻辑可能是很多的。实际业务代码可能100行
} else if(level === 'A') {
return salary * 3 // 这里的处理逻辑可能是很多的。实际业务代码可能100行
} else if(level === 'B') {
return salary * 2 // 这里的处理逻辑可能是很多的。实际业务代码可能100行
} else {
return 0
}
}
下面采用策略模式进行初步优化
const calcS = salary => salary * 4 // 计算S绩效的员工年终奖
const calcA = salary => salary * 3 // 计算A绩效的员工年终奖
const calcB = salary => salary * 2 // 计算B绩效的员工年终奖
/* 计算年终奖
* @params level 员工绩效等级
* @params salary 员工月薪
* return 年终奖金
*/
function rewardCalc(level, salary){
if(level === 'S') {
return calcS(salary)
} else if(level === 'A') {
return calcA(salary)
} else if(level === 'B') {
return calcB(salary)
} else {
return 0
}
}
讲解:
-
上述代码的核心目的,就是将不同的绩效当做不同的策略去执行不同的函数,也就是,我们将每一个if分支下的代码拆分了出去。
-
可能有人会说,你这个拆分之后,实际上代码变多了,我并没有看出你这儿改造之后,好在哪儿? 的确,上述的例子来看的话,代码量确实是增加的。
-
但是,这仅仅是举例子,在真实项目中,每一个计算函数,可能逻辑代码有几百行。这个时候,你再去看这个设计。 采用策略模式去进行逻辑分割之后,在主函数中,逻辑就会变得比较清晰了。代码可维护性会大大提升。
采用表驱动编程,进一步优化掉if语句,简化上面的代码
const calcS = salary => salary * 4 // 计算S绩效的员工年终奖
const calcA = salary => salary * 3 // 计算A绩效的员工年终奖
const calcB = salary => salary * 2 // 计算B绩效的员工年终奖
/* 计算年终奖
* @params level 员工绩效等级
* @params salary 员工月薪
* return 年终奖金
*/
function rewardCalc(level, salary){
const mapCalc = { 'S': calcS, 'A': calcA, 'B': calcB }
return mapCalc[level] ? mapCalc[level](salary) : 0
}