js策略模式的web场景运用

90 阅读2分钟

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
}