如何优化大量 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,优化是给真正复杂的情况准备的。 并且需要注意适度原则,面向过程的代码更适合新手,并且理解成本更低,逻辑更严谨抽象程度更高的代码,抽象效率更高,理解成本也会更高