如何优化大量 if-else

如何优化大量 if-else


1. 拆分为小函数

将每个分支逻辑抽成独立函数,主流程只负责调度,逻辑清晰且易于测试。

// 优化前
if ($type == 1) {
    // 几十行处理逻辑 A
} else if ($type == 2) {
    // 几十行处理逻辑 B
} else if ($type == 3) {
    // 几十行处理逻辑 C
}

// 优化后
match ($type) {
    1 => $this->doPlanA(),
    2 => $this->doPlanB(),
    3 => $this->doPlanC(),
};

核心思路:主方法只表达”做什么”,具体”怎么做”下沉到子函数。


2. 查表法(HashMap)

if-else 只做值映射时,直接换成查表,一行搞定。

// 优化前
if ($status == 1) {
    $label = '待审核';
} else if ($status == 2) {
    $label = '已通过';
} else if ($status == 3) {
    $label = '已拒绝';
} else {
    $label = '未知状态';
}

// 优化后
$labelMap = [
    1 => '待审核',
    2 => '已通过',
    3 => '已拒绝',
];
$label = $labelMap[$status] ?? '未知状态';

适用场景:状态码 → 文案、类型 → 配置、key → handler 等一对一映射。


3. 提前返回(Early Return)

把非法条件前置过滤,让主逻辑保持在同层缩进,消除 else 嵌套。

// 优化前
function handle($order) {
    if ($order) {
        if ($order->isPaid()) {
            if ($order->isNotExpired()) {
                // 真正业务逻辑
            } else {
                return '已过期';
            }
        } else {
            return '未支付';
        }
    } else {
        return '订单不存在';
    }
}

// 优化后
function handle($order) {
    if (!$order) return '订单不存在';
    if (!$order->isPaid()) return '未支付';
    if ($order->isExpired()) return '已过期';

    // 真正业务逻辑
}

关键技巧:条件取反,不满足就 return 或 throw,让正常流程一路到底。


4. 策略模式 + 工厂

分支对应不同算法/处理逻辑时,用策略模式彻底消除 if-else。

// 1. 定义接口
interface PaymentStrategy {
    public function pay($data);
}

// 2. 各策略实现
class OnlinePay implements PaymentStrategy {
    public function pay($data) { /* 在线支付逻辑 */ }
}
class OfflinePay implements PaymentStrategy {
    public function pay($data) { /* 线下支付逻辑 */ }
}

// 3. 工厂创建
class PaymentFactory {
    public static function make($type): PaymentStrategy {
        return match ($type) {
            'online'  => new OnlinePay(),
            'offline' => new OfflinePay(),
            default   => throw new \InvalidArgumentException("未知支付类型: $type"),
        };
    }
}

// 4. 调用方
$strategy = PaymentFactory::make($type);
$strategy->pay($data);

适用场景:多套算法、多支付渠道、多通知方式等可抽象为统一行为的不同实现。


原则:能跑通的代码比”优雅的代码”更重要。分支 ≤3 个直接写 if-else,优化是给真正复杂的情况准备的。 并且需要注意适度原则,面向过程的代码更适合新手,并且理解成本更低,逻辑更严谨抽象程度更高的代码,抽象效率更高,理解成本也会更高

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部