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

手法:Inline Function(内联函数)

把简单到多余的函数收回调用处:函数体与名字一样清楚、或只剩一层转发时,内联能消除不必要的间接层;内联也是重组前清场的手段。

内联函数是什么

内联函数是把一个简单到多余的函数收回调用处:当函数体比函数名更清楚,或者函数只剩一层转发时,内联能消除不必要的间接层。它与提取函数互为逆操作,也常用来清场——先把层层包装拆掉,再重新做合理的划分。

基本信息

适用场景函数体比名字更清晰、纯委托、提炼过度
反向操作提取函数
步骤找到全部调用点,替换为函数体,删除定义
工具支持IDE 的内联重构可一并处理多态分派
前置条件有测试覆盖或能快速回滚

典型使用场景

  • 只有一行返回的包装函数,名字没带来额外信息
  • 名字与实现完全重复的辅助方法
  • 过度提炼产生的一串碎函数调用链
  • 重构前清场:先内联中间层,再重新组织职责
  • 多态方法只有一处调用且没有子类覆写

内联前后

内联前后
// 内联前:函数名没有增加信息,还多一层跳转
double basePrice() {
    return moreThan100() ? base * 0.95 : base;
}
boolean moreThan100() {
    return base > 100;
}

// 内联后:条件直接写在用到的地方
double basePrice() {
    return base > 100 ? base * 0.95 : base;
}

什么时候内联

情况建议理由
函数体比名字更清楚内联名字没提供额外信息
只剩一层转发内联调用链变短,调试更直接
薄函数被测试替换使用先确认再动内联可能破坏测试钩子
手工内联多态方法容易漏掉子类覆写带来的动态分派差异;涉及多态时优先用 IDE 的重构功能,它会把分派语义一起处理。
内联会同时改变代码组织与测试钩子:确认没有测试依赖那个薄函数作为替换点,否则重构会连带弄坏测试。
内联后先跑测试再提交,并确认没有调用点残留(编译器与引用查找都能发现);函数被删掉时,同步清理只针对它的单元测试与文档示例。

易错点

  • 为消除转发层忽略测试钩子:有的薄函数被单测替换使用,内联后测试失效
  • 手工内联多态方法:漏掉子类覆写,运行期语义改变
  • 内联后反复提炼:来回震荡,方向应在评审里先定下来
  • 忽略调试影响:内联后堆栈少一层、断点位置变化,排障时容易误判调用来源

数据来源与参考

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