应重构嵌套超三层或含五个以上if/else的函数,采用卫语句提前退出、对象映射替代长链分支、拆分小函数+提前返回、复杂场景用策略模式,确保逻辑线性、新增不改旧、测试路径可控。

嵌套超过三层或单个函数里有五个以上 if/else 分支,就该重构了。核心是让逻辑线性、新增不改旧、测试路径可控。
用卫语句提前退出
把拦截性判断(如空值、非法状态、权限不足)放在最前面,直接 return 或 throw,主业务逻辑自然“浮”到顶层。
- 用户操作前先检查:if (!user) return;、if (!user.isActive()) return;
- 接口入参校验:if (!data || typeof data !== 'object') throw new Error('参数错误');
- 后续所有代码都默认在合法上下文中执行,缩进大幅减少,调试时一眼看清“什么情况下根本不往下走”
用对象映射替代长链分支
当判断依据是某个确定值(如 status、type、code),且每个分支执行的是独立动作,就别写一长串 else if。
- 定义行为映射表:const handlers = { pending: () => fetchOrder(), success: () => renderSuccess(), error: () => showRetry() };
- 调用只需一行:handlers[status]?.() ?? defaultHandler();
- 新增类型只需往对象里加一项,不碰原有逻辑;单元测试可单独覆盖每个 key,路径清晰
拆成小函数 + 提前返回
把每个分支的主体逻辑抽成独立函数,主流程变成一连串 if 判断 + 调用 + return,彻底扁平化。
立即学习“Java免费学习笔记(深入)”;
- 例如:if (isOverdue(order)) return handleOverdue(order);
if (isDiscountEligible(order)) return applyDiscount(order);
return processNormalOrder(order); - 每个函数职责单一,命名即文档(如 handleOverdue 本身就在说明意图)
- 调试时容易定位到具体哪条路径,也方便复用和单独测试
复杂算法场景用策略模式
当不同条件对应的是整套不同算法(比如不同支付方式的验签、不同渠道的消息模板渲染),策略模式最合适。
- 定义统一接口:class PaymentStrategy { validate() {}; execute() {} }
- 为每种方式写实现类:AlipayStrategy、WechatStrategy
- 工厂根据 channel 字段返回对应实例,主流程只跟接口打交道;加新渠道只需新增策略类和注册逻辑,完全不修改调度代码


















