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

手法:Parameterize Function(函数参数化)

结构相同只是取值不同的多个函数合并为一个带参数的函数:消除重复、统一入口;参数含义太宽泛时拆回多个函数,避免布尔参数可读性问题。

是什么

函数参数化把结构相同、只有取值不同的多个函数合并为一个带参数的函数:消除重复代码,统一调用入口,修改规则时只需改一处。它的边界很关键——当参数越来越宽泛、含义需要靠约定理解时,应当拆回多个函数;用布尔标志控制两条分支的写法尤其要避免,调用点看不出行为差异。

要点

适用场景两三个函数结构完全相同,仅常量或字面量不同
做法合并结构并抽出参数,逐一替换调用点
反向操作移除标志参数:把布尔分支拆成命名明确的方法
质量线参数含义清晰,调用点无需查阅定义即可读懂

典型使用场景

  • 多次调整比例:把涨薪幅度作为参数,替代一整套固定比例的函数
  • 限额校验:不同等级的限额规则相同,用参数区分业务等级
  • 时间窗口过滤:近七天、近三十天的逻辑一致,用参数表示窗口长度
  • 重试策略:次数与间隔成为参数,避免为每种组合写一个方法
  • 文案与标签承载:同一渲染逻辑按类型参数输出不同前缀

示例

示例
// 调整前:两段完全相同的逻辑,只有比例不同
void tenPercentRaise(Person p) { p.raise(1.10); }
void fivePercentRaise(Person p) { p.raise(1.05); }

// 调整后:合并为一个带参数的函数
void raise(Person p, double factor) { p.raise(factor); }

合并与拆分的判断

情形建议理由
结构相同、仅常量不同合并并参数化消除重复,规则变化只需改一处
参数取值只有真假两种且分支含义不同拆成两个具名方法调用点可自解释,避免标志参数
参数含义需要备注才能理解拆回多个函数可读性低于合并之前
参数数量随合并不断增加停止合并说明这些函数的相关性不足
业务规则会各自变化保留独立函数变化方向不同,合并后又会分叉
合并时要连带考虑命名:函数名与参数名需要一起表达语义,例如把幅度作为参数后,函数名应体现「按幅度调整」而不是沿用原来的具体比例名。
参数化与保持对象完整常配套使用:如果参数是一组总是一起出现的字段,先聚成对象再传,比继续增加参数个数更清晰。

落地检查清单

  • 合并后的参数含义清晰,调用点无需查阅定义
  • 没有用布尔参数承载两条语义不同的分支
  • 调用点全部替换完成,旧函数已删除
  • 保留必要的文档说明参数取值范围与默认语义

易错点

  • 参数越并越多:函数变成多分支开关,可读性反而低于合并前的多个函数
  • 用布尔标志承载两条分支:调用点出现裸真假值,阅读时无法判断实际行为
  • 把会各自变化的规则合并:两个业务很快又分叉,出现条件分支,重复以另一种形式回来
  • 合并后旧函数未删除:两条入口并存,调用方逐渐分不清该用哪个

数据来源与参考

  • 《重构》第 2 版 · 第 11 章(Parameterize Function)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌