首页/开发/代码质量与评审速查/手法:Inline Class(内联类)
重构手法62 条

手法:Inline Class(内联类)

类不再有单独价值时把它内联回使用方:职责极少、只剩数据袋、或过度提炼的产物;与 Extract Class 互为逆操作,两者都是让边界与当前需求匹配。

是什么

内联类(Inline Class)把一个已经不再有独立价值的类合并回它的使用方:类里的字段与行为搬到调用处,原来的类型随即删除。它常用于处理过度提炼的产物——某个类当初被拆出来是为了承载一项职责,后来这项职责被移走或消失,类只剩一层包装。它与提炼类互为逆操作,两者都是让代码边界与当前需求对齐。

识别与做法

信号类只剩一两个方法,或方法体全是取值赋值
信号与使用者几乎同生命周期,创建后立即被消耗
做法成员搬到使用方,更新全部引用,再删除旧类型
反向操作提炼类:职责增多到需要独立边界时再拆出去

典型使用场景

  • 只有一个使用方的辅助类:抽象没有带来复用价值,反而增加跳转层级
  • 纯数据载体:字段加上满屏取值赋值方法,行为其实都在别处
  • 过度提炼:为拆分而拆分产生的小类,职责一句话说不清
  • 职责被搬空:原有逻辑已迁走,剩下的方法只是转发
  • 局部范围对象:为一次调用而临时创建的类型,调用方构造函数比它更直观

判断线索

判断线索
# 判断该不该内联
类名 ShippingPlan 只有两个字段和 getter/setter      → 考虑内联
search() 里唯一的局部变量类型只在本方法内使用        → 考虑内联
该类被三个模块引用,且各自定制行为                  → 保留,属于真实抽象

内联前检查

检查项原因
是否存在外部使用者公共类型删除属于破坏性变更,需先确认调用面
是否有独立变化轴类是否需要单独演进,是则不应内联
是否承担横切职责校验、埋点、权限等职责搬走会改变语义,需保留
使用方是否已有过多字段内联后字段继续膨胀,说明拆分方向本就选错了
序列化与反射依赖部分框架依赖类型名,删除类型会影响配置与存储格式
内联后如果使用方的字段与方法数量明显膨胀,先停下来复核方向:这通常说明最初的拆分对象选错了,应改为把职责重新分配到另一个类,而不是简单地合并掉。
内联与提炼是一对可以反复使用的工具。先内联到使用方让逻辑集中,看到真实的变化点之后再重新提炼,比在错误边界上反复调整更省力。

落地检查清单

  • 确认该类型没有外部使用者,或已完成替换
  • 把字段与行为搬到使用方,逐步替换引用而不是一次改完
  • 删除旧类型后跑一遍完整测试与序列化相关用例
  • 检查内联后使用方是否仍然职责清晰

易错点

  • 内联后使用方字段爆炸:说明抽象方向本来就不对,越合越乱,需要重新划分职责
  • 公共类型直接内联造成接口破坏:外部使用者编译失败,必须走废弃流程而非直接删除
  • 忽略框架对类型名的依赖:配置、存储或序列化格式中记录了旧类型名,删除后运行时报错
  • 为减少代码行数而内联:合并没有解决职责问题,只是把复杂性换了位置

数据来源与参考

  • 《重构》第 2 版 · 第 7 章(Inline Class)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌