分解条件表达式是什么
把复杂条件拆成命名函数:条件判断本身成为函数,各分支的计算也成为函数,主干只保留意图表达。它常与提取函数配合使用,拆开后骨架清晰,每个分支的逻辑可以单独验证。
基本信息
| 拆分对象 | 条件表达式函数 + 各分支计算函数 |
|---|---|
| 收益 | 主干清晰,分支逻辑可单独验证 |
| 命名要求 | 函数名表达业务意图,而不是照抄表达式 |
| 常见组合 | 与提取函数、卫语句替换嵌套条件配合 |
| 适用信号 | 条件长到需要写注释才能读懂 |
典型使用场景
- 计费规则按季节与时段判断,表达式很长
- 权限判断包含多个角色与状态的组合
- 报价计算里条件与公式交织在一起
- 校验逻辑里多个并且与或者混用
- 条件里出现魔数,靠注释说明含义
分解前后
分解前后
// 之前:条件与公式混在一起
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) | 公式可单独测试与复用 |
| 魔数与阈值 | 改为命名常量或参数 | 含义固定,调整集中 |
命名质量决定这次重构的价值:函数名说出业务意图(例如淡季计费),而不是把表达式直译成英文长句。
拆出的函数不要共享可变状态:如果分支函数仍读写同一批字段,拆分只是视觉上的整齐,耦合依旧存在。
配合手法
- 与卫语句配合:先处理边界,再分解主干条件
- 与以多态取代条件配合:分支差异按类型下沉
- 与提取变量配合:把中间结果命名,条件随之变短
- 与命名常量配合:把魔数换成有业务含义的名字
拆分后回看主干:如果读主干仍需跳进分支函数才能明白整体,说明拆的是表达式而不是意图,需要重新调整函数名或划分层次。