1.使用策略模式替换"胖"分支
重构前
function getPrice(tag,originPrice){
//新人价格
if(tag==='newUser'){
return originPrice>50.1?originPrice-50:originPrice
}
//返场价格
if(tag==='back'){
return originPrice>200?originPrice-50:originPrice
}
//活动价格
if(tag==='activity'){
return originPrice>300?originPrice-100:originPrice
}
重构后
const priceHandler={
newUser(originPrice){
return originPrice>50.1?originPrice-50:originPrice
},
back(originPrice){
return originPrice>200?originPrice-50:originPrice
},
activity(originPrice){
return originPrice>300?originPrice-100:originPrice
}
}
function getPrice(tag,originPrice){
return priceHandler[tag](originPrice)
}
2.分解条件表达式
//计算一件商品的总价,该商品在冬季和夏季的单价是不同的
if(!aDate.isBefore(plan.summerStart)&&!aDate.isAfter(plan.summerEnd))
charge=quantity*plan.summerRate;
else
charge=quantity*plan.regularRate+plan.regularServiceCharge
//重构后
if(summer())
charge=summerCharge()
else
charge=regularCharge()
function summer(){
return !aDate.isBefore(plan.summerStart)
}
function summerCharge(){
return quantity*plan.summerRate
}
function regularCharge(){
return quantity*plan.regularRate+plan.regularServiceCharge
}
//进一步优化(使用三元运算符)
charge=summer()?summerCharge():regularCharge()
3.合并条件表达式
if(anEmployee.seniority<2) return 0;
if(anEmployee.monthsDisabled>12) return 0;
if(anEmployee.isPartTime) return 0;
//重构后
if(isNotEligableForDisability()) return 0;
function isNotEligableForDisability(){
return ((anEmployee.seniority<2)||(anEmployee.monthsDisabled>12)||(anEmployee.isPartTime);
}