首先,条件判断到底是该用if-else还是switch,似乎是所有编程语言都存在的讨论。
// if语句:
if ( val == 0) {
// 对于0的相关处理
} else if(val == 1) {
// 对于1的相关处理
} else if( val == 2) {
// 对于2的相关处理
} else {
// 对于其他情况的相关处理
}
// switch语句:
switch(val) {
case 0:
// 对于0的相关处理
break;
case 1:
// 对于1的相关处理
break;
case 2:
// 对于2的相关处理
break;
default:
// 对于其他情况的相关处理
}
如果只有一两个条件的判断,通常if-else处理条件的时间会比switch更快,当判断条件多到两个以上时,在大多数情况下,switch处理单个条件的时间比if-else更快,所以switch更加适合。
策略模式:定义一系列的处理流程或算法,把他们分别封装起来,使得他们可以相关替代。目的就是将算法的使用和实现分离,避免出现大量if...else或者switch...case。
一个具体的场景为例,假设年底公司要根据员工的绩效等级发放奖金,绩效考核为S的是4个月工资,A的是3个月工资,B的是2个月工资,C的是1个月工资。
if-else实现方式如下:
function calculateBonus(salary, level) {
if(level === 'S') {
return salary * 4;
} else if(level === 'A') {
return salary * 3;
} else if(level === 'B') {
return salary * 2;
} else if(level === 'C') {
return salary * 1;
}
}
策略模式的实现方式如下:
const bonusWay = {
"S": (salary) => sallary * 4,
"A": (salary) => sallary * 3,
"B": (salary) => sallary * 2,
"C": (salary) => sallary * 1,
}
function calculateBonus(salary, level) {
return bonusWay[level](salary)
}
策略模式很好地利用了组合、委托及多态等技术思想,有效地避免了类似if-else等多种功能条件选择语句。同时它完美支持了开放——封闭原则,将处理算法封装在独立的策略中,易于理解、切换和扩展。
对于条件判断的使用建议:
- 当匹配的条件仅为一两个离散值时,或者容易划分不同取值范围时,使用if-else语句。
- 当匹配的条件超过一两个但少于十个值时,使用swtich语句。
- 当匹配的条件超过十个值时,使用策略模式。