是什么
函数参数化把结构相同、只有取值不同的多个函数合并为一个带参数的函数:消除重复代码,统一调用入口,修改规则时只需改一处。它的边界很关键——当参数越来越宽泛、含义需要靠约定理解时,应当拆回多个函数;用布尔标志控制两条分支的写法尤其要避免,调用点看不出行为差异。
要点
| 适用场景 | 两三个函数结构完全相同,仅常量或字面量不同 |
|---|---|
| 做法 | 合并结构并抽出参数,逐一替换调用点 |
| 反向操作 | 移除标志参数:把布尔分支拆成命名明确的方法 |
| 质量线 | 参数含义清晰,调用点无需查阅定义即可读懂 |
典型使用场景
- 多次调整比例:把涨薪幅度作为参数,替代一整套固定比例的函数
- 限额校验:不同等级的限额规则相同,用参数区分业务等级
- 时间窗口过滤:近七天、近三十天的逻辑一致,用参数表示窗口长度
- 重试策略:次数与间隔成为参数,避免为每种组合写一个方法
- 文案与标签承载:同一渲染逻辑按类型参数输出不同前缀
示例
示例
// 调整前:两段完全相同的逻辑,只有比例不同
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); }合并与拆分的判断
| 情形 | 建议 | 理由 |
|---|---|---|
| 结构相同、仅常量不同 | 合并并参数化 | 消除重复,规则变化只需改一处 |
| 参数取值只有真假两种且分支含义不同 | 拆成两个具名方法 | 调用点可自解释,避免标志参数 |
| 参数含义需要备注才能理解 | 拆回多个函数 | 可读性低于合并之前 |
| 参数数量随合并不断增加 | 停止合并 | 说明这些函数的相关性不足 |
| 业务规则会各自变化 | 保留独立函数 | 变化方向不同,合并后又会分叉 |
合并时要连带考虑命名:函数名与参数名需要一起表达语义,例如把幅度作为参数后,函数名应体现「按幅度调整」而不是沿用原来的具体比例名。
参数化与保持对象完整常配套使用:如果参数是一组总是一起出现的字段,先聚成对象再传,比继续增加参数个数更清晰。
落地检查清单
- 合并后的参数含义清晰,调用点无需查阅定义
- 没有用布尔参数承载两条语义不同的分支
- 调用点全部替换完成,旧函数已删除
- 保留必要的文档说明参数取值范围与默认语义