代码中为什么不推荐使用 else if
目录
代码中慎用(不是不用) else if 的原因:提升可维护性与可读性
大部分场景下都可以用其他的替代方案来替代 else if ,从而提升代码的可维护性和可读性
问题案例
是不是经常在项目里看到这种屎山代码:
// 原始代码(简化版)
if (userLevel == VIP) {
applyDiscount(0.3);
} else if (orderAmount > 1000) {
applyDiscount(0.2);
} else if (couponType == "新人券") {
applyDiscount(0.1);
} else if (couponType == "活动券"){
applyDiscount(0.5);
}else if (...){
}else if (...){
}
// 然后每次有新需求就加个 else if
// 代码逐渐失控.....
如果 else if 能够确定不超过三层的情况还是可以用的
一、方案一:卫语句(Guard Clauses)
逻辑提前终止,减少后续代码阅读量
// 原始代码(简化版)
if (userLevel == VIP) {
applyDiscount(0.3);
return
}
if (orderAmount > 1000) {
applyDiscount(0.2);
return
}
if (couponType == "新人券") {
applyDiscount(0.1);
return
}
if (couponType == "活动券"){
applyDiscount(0.5);
return
}
if (...){
return
}
if (...){
}
不仅仅是用在替代 else if,在日常代码开发中,卫语句(Guard Clauses) 非常的好用,逻辑代码执行,判断结束则可以直接 return 返回,无须再去判断之后的逻辑,减少代码阅读复杂度
二、方案二:策略模式+工厂类
代码优化如下
var strategyRegistry = map[string]DiscountStrategy{
"vip": &VipStrategy{0.8},
"credit": &CreditStrategy{},
"default": &DefaultStrategy{},
}
func GetStrategyByName(name string) DiscountStrategy {
if s, ok := strategyRegistry[name]; ok {
return s
}
return &DefaultStrategy{}
}
三、方案三:使用 switch
switch 的可读性和 else if 其实是差不多的,判断语句不多的情况下还是可以作为一种替换方案的
func applyDiscount(userLevel string, orderAmount float64, couponType string) float64 {
discount := 0.0
switch {
case userLevel == "VIP":
discount = 0.3
case orderAmount > 1000:
discount = 0.2
case couponType == "新人券":
discount = 0.1
case couponType == "活动券":
discount = 0.5
// 可以继续添加更多 case
default:
discount = 0.0 // 默认无折扣
}
return discount
}
结论
-
代码编写尽可能使用 卫语句(Guard Clauses)
-
尽可能少用 else if,可以使用 switch、策略模式、工厂模式替换