首页/开发/代码质量与评审速查/手法:Replace Conditional with Polymorphism(以多态取代条件)
重构手法62 条

手法:Replace Conditional with Polymorphism(以多态取代条件)

按类型分支的行为分散在多个条件语句里时:为类型建立类层次,把分支下沉到各自实现;新增类型无需修改调用方,分支逻辑与类型绑定。

以多态取代条件是什么

当同一组按类型分支的行为分散在多个条件语句里时,为类型建立类层次,把各分支下沉到对应实现。新增类型只需加一个实现类,不必再搜索所有分支;分支逻辑与类型定义绑在一起,漏改与改错的风险明显下降。

基本信息

适用场景同一组条件在多处按类型分支
步骤建立类层次,用工厂选择实现,分支下沉
前提类型集合相对封闭,各分支行为差异显著
相邻手法策略模式(可替换算法)、模式匹配(语言支持时)
收益新增类型不需要修改调用方

典型使用场景

  • 计费规则按客户类型分支,计价与对账都要判断
  • 按对象类型计算速度、容量等属性
  • 通知渠道按类型走不同的发送逻辑
  • 权限类型在过滤与展示中重复判断
  • 语言支持模式匹配时,先评估是否比类层次更直白

方向示例

方向示例
class Bird {
    double speed() { ... }
}
class EuropeanSwallow extends Bird { ... }
class AfricanSwallow extends Bird { ... }

// 调用方不再判断类型
return bird.speed();

多态还是策略

维度类层次(多态)策略对象
变化维度类型本身有稳定的行为差异同一算法需要运行期替换
组合方式继承表达是一种的关系组合表达有依赖的关系
选择时机类型在建模阶段已经确定运行期按配置或环境切换
语言支持时先用模式匹配评估:Java 的模式匹配分支、Rust 的枚举配合匹配往往比类层次更直白,尤其当类型集合封闭、行为不复杂时。
多态化后原条件的求值顺序可能丢失:原来靠条件先后顺序实现的短路效果,需要在拆分时显式保持,否则行为会变。

迁移步骤

  • 先把每个分支的具体实现搬进独立方法,调用方仍走原条件
  • 建立类型层次,用工厂按类型创建实现
  • 逐个调用点替换为多态调用,未切换前保留旧条件
  • 全部切换后删除条件与空壳方法,跑全量测试

易错点

  • 分支行为差异很小也建层次:抽象收益不足,类数量膨胀
  • 多态化后丢掉原条件的求值顺序:短路语义变化,边角行为不同
  • 类层次建好后调用方仍到处判断类型:分支没有真正下沉,只是多了一层包装
  • 用继承表达可运行期替换的行为:切换时要重建对象,应改用组合

数据来源与参考

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