平时的工作中小伙伴们比较关心的除了基本工资,岗位工资,各种补助吧啦吧啦,最后当然还有年终奖了,虽然不是人人都有的,举个栗子:绩效为A的小伙伴,年终奖为6个月工资;绩效为B的小伙伴,年终奖为3个月工资;绩效为C的小伙伴,年终奖为2个月工资,一个简单的薪资计算公式就来了
function calculateBonus (performanceLevel, salary) {
if(performanceLevel==='A'){
return salary * 6
}
if(performanceLevel==='B'){
return salary * 3
}
if(performanceLevel==='C'){
return salary * 2
}
}
calculateBonus ('A', 2000) => 12000 轻松实现
分割线================================================================
显然这样的方式可以实现想要的结果,但是从单一职责原则来看,对于不同的级别,有一天我们需要修改相应的奖金倍数,势必要改函数体的逻辑
考虑把计算逻辑抽离
let performanceA = function(salary){
return salary * 6
};
let performanceB = function(salary){
return salary * 3
};
let performanceC = function(salary){
return salary * 2
};
let calculateBonus = function (performanceLevel, salary) {
if(performanceLevel==='A'){
return performanceA(salary)
}
if(performanceLevel==='B'){
return performanceB(salary)
}
if(performanceLevel==='C'){
return performanceC (salary)
}
}
这样的话,对于不同级别的奖金,只需要修改相应的计算逻辑而不需要再动外部的计算逻辑,这样比上一步好一些,但是依然有优化的空间,每个人都有奖金,体现不了区别,公司说了我们要增加一个级别D,没有奖金,这个时候又要改逻辑包括计算逻辑。
分割线=================================================================
let strategy = {
"A":function(salary){
return salary * 6
},
"B":function(salary){
return salary * 3
},
"C":function(salary){
return salary * 2
},
"D":function(salary){
return 0
},
};
function calculateBonus (level,salary) {
return strategy[level](salary)
}
calculateBonus("A", 2000)
到这,基本没有什么可以优化的了,无论是新增一个级别还是修改一个级别对应的奖金,都足以在最小的改动下满足,而不需要改动主方法