策略
策略的两层内功
第一层 策略模式在JavaScript这个编程语言中的体现就像把if的判断条件作为了对象的key
const calculateBonus = (performanceLevel, salary) => {
if (performanceLevel === 'S') {
return salary * 4;
} else if (performanceLevel === 'A') {
return salary * 3;
} else if (performanceLevel === 'B') {
return salary * 2;
}
return salary
};
calculateBonus('B', 20000); // 输出:40000
首先从代码实现角度if、else更直观(但是当if、else达到一定数量,整个代码可阅读性将成倍降低)
但是弊端也很明显,可维护性差,performanceLevel的修改需要整个calculateBonus的修改
(此时产生bug的可能性将成倍增加)
思考有没有什么办法让calculateBonus保持不变 这样我只测试改动对应的业务代码即可
第一次修改
const S = (salary) => salary * 4
const A = (salary) => salary * 3
const B = (salary) => salary * 2
const performanceLevelToFn = {
S,
A,
B
}
const calculateBonus = (performanceLevel, salary) => {
return performanceLevelToFn[performanceLevel](salary)
};
calculateBonus('B', 20000); // 输出:40000
首先从业务实现角度calculateBonus通过performanceLevel委托对应的业务函数去实现
这样保证calculateBonus是一个稳定函数
performanceLevel对应的业务函数新增、修改只用测试对应的函数即可
第二层 不局限于使用对象的key去
以calculateBonus('B', 20000)这个测试用例为例子
因为JavaScript的函数是一等公民,此时是不是可以把B级对应的业务函数直接传递进去
const S = (salary) => salary * 4
const A = (salary) => salary * 3
const B = (salary) => salary * 2
const calculateBonus = (fn, salary) => {
return fn(salary)
};
calculateBonus(B, 20000); // 输出:40000
首先从业务实现角度calculateBonus直接调用performanceLevel对应的业务函数
这样保证calculateBonus只是一个委托函数,所以测试可以直接去测试对应业务函数即可
但是从代码只管的角度来讲并没有一开始if、else看着清晰