目录

代码中为什么不推荐使用 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、策略模式、工厂模式替换