首页/开发/代码质量与评审速查/手法:Change Function Declaration(调整函数声明)
重构手法62 条

手法:Change Function Declaration(调整函数声明)

为函数改名或改参数:改名表达新意图,加参数补充信息,删参数简化调用;迁移期可保留旧签名作为过渡(并标记废弃),调用点分批切换。

调整函数声明是什么

调整函数声明指给函数改名或改参数:改名表达新意图,加参数补充信息,删参数简化调用。直接在原地改会让所有调用点同时失效,因此迁移期通常保留一个旧签名做过渡(标注废弃并转发到新实现),调用点分批切换,全部切完再删除旧签名。

基本信息

做法改名、增参、减参、调整参数顺序
过渡形态旧签名转发 + 废弃标记
收尾动作所有调用点切换后删除旧签名
影响面同仓库调用点、下游依赖、对外接口
必要前提有测试或编译期能发现全部调用点

典型使用场景

  • 函数名与现在的职责不符,容易被误用
  • 参数太少,每个调用方都要额外传上下文
  • 参数太多,常成组出现,适合合并为参数对象
  • 参数顺序容易记错,需要调整或改用命名参数
  • 公共库下线旧签名,需要一段废弃周期

过渡形态

过渡形态
// 旧名字保留一段时间,转发到新实现
@Deprecated
double circum(double radius) {
    return circumference(radius);
}

double circumference(double radius) {
    return 2 * Math.PI * radius;
}
// 全部调用点切换完成后,删除旧签名

改签名的方式

做法适用风险
原地直接改调用点少且全在仓库内编译期即暴露全部影响
旧签名转发过渡公共库或跨团队调用过渡期过长会留下两套入口
参数对象替换多参数参数常成组出现需同步修改所有构造点
公共库的签名变更要走废弃周期:保留一个发布周期的旧签名,同时给出替代指引与时间点,让下游有迁移窗口。
调整参数顺序最危险:类型相同或兼容时编译器不会报错,调用方会静默传错值;顺序调整应尽量让类型可区分,或改用命名参数。
动手前先做一次调用点盘点:仓库内用引用查找,跨仓库看文档与发布说明。参数顺序类改动必须逐个核对,编译器在这类错误上帮不上忙。

易错点

  • 删除公共方法前不检索外部引用:下游编译直接失败,修复要等下一个版本
  • 参数顺序调换未逐个检查调用点:类型兼容时静默传错,问题在运行期才暴露
  • 过渡签名长期不清理:两套入口并存,新代码继续沿用旧写法
  • 改名与行为改动混在一个提交:出问题时无法区分是名字还是逻辑引起

数据来源与参考

  • 《重构》第 2 版 · 第 6 章(Change Function Declaration)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌