首页/开发/代码质量与评审速查/手法:Decompose Conditional(分解条件表达式)
重构手法62 条

手法:Decompose Conditional(分解条件表达式)

把复杂条件拆成命名函数:条件判断与各分支各自成函数,主干只剩意图表达;与 Extract Function 组合使用,分支逻辑可分别测试。

分解条件表达式是什么

把复杂条件拆成命名函数:条件判断本身成为函数,各分支的计算也成为函数,主干只保留意图表达。它常与提取函数配合使用,拆开后骨架清晰,每个分支的逻辑可以单独验证。

基本信息

拆分对象条件表达式函数 + 各分支计算函数
收益主干清晰,分支逻辑可单独验证
命名要求函数名表达业务意图,而不是照抄表达式
常见组合与提取函数、卫语句替换嵌套条件配合
适用信号条件长到需要写注释才能读懂

典型使用场景

  • 计费规则按季节与时段判断,表达式很长
  • 权限判断包含多个角色与状态的组合
  • 报价计算里条件与公式交织在一起
  • 校验逻辑里多个并且与或者混用
  • 条件里出现魔数,靠注释说明含义

分解前后

分解前后
// 之前:条件与公式混在一起
if (date.before(SUMMER_START) || date.after(SUMMER_END)) {
    charge = quantity * winterRate + winterServiceCharge;
} else {
    charge = quantity * summerRate;
}

// 之后:条件与分支各自成函数
if (notSummer(date)) {
    charge = winterCharge(quantity);
} else {
    charge = summerCharge(quantity);
}

三个可拆分的位置

位置示例收益
条件判断notSummer(date)主干一眼看出分支意图
分支计算winterCharge(quantity)公式可单独测试与复用
魔数与阈值改为命名常量或参数含义固定,调整集中
命名质量决定这次重构的价值:函数名说出业务意图(例如淡季计费),而不是把表达式直译成英文长句。
拆出的函数不要共享可变状态:如果分支函数仍读写同一批字段,拆分只是视觉上的整齐,耦合依旧存在。

配合手法

  • 与卫语句配合:先处理边界,再分解主干条件
  • 与以多态取代条件配合:分支差异按类型下沉
  • 与提取变量配合:把中间结果命名,条件随之变短
  • 与命名常量配合:把魔数换成有业务含义的名字
拆分后回看主干:如果读主干仍需跳进分支函数才能明白整体,说明拆的是表达式而不是意图,需要重新调整函数名或划分层次。

易错点

  • 拆出的函数名照抄表达式:抽象层次没提高,读起来更绕
  • 分支函数共享可变状态:拆分后仍互相牵连,测试依旧难写
  • 把条件拆散到多个小函数却不集中:判断依据分散,理解成本反而上升
  • 顺手改动判断逻辑:重构与行为改动混在一起,回归时无法区分原因

数据来源与参考

  • 《重构》第 2 版 · 第 10 章(Decompose Conditional)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌