Combine Functions into Class 是什么
当多个函数围绕同一份数据工作、反复接收同一组参数时,把这组数据和这些函数合并进一个类,调用方就不再需要搬运参数,也不必知道中间的计算细节。若处理的是「先输入再输出」的一次性管道,则用 Combine Functions into Transform:把中间结果作为显式的中间结构在函数间传递,避免在各处重复计算。
基本信息
| 选择 | 有持续状态 → Class;一次性数据变形 → Transform |
|---|---|
| 效果 | 调用方依赖减少,中间结构可以隐藏 |
| 入口 | 先做 Encapsulate Record 把散落的字段收进对象 |
| 注意 | 类只收容围绕同一份数据的函数 |
判断信号
- 同一组参数在五个函数里反复出现,顺序还总一样
- 中间结果被反复计算,或在多个函数里各算一遍
- 调用方要自己记住「先调哪个再调哪个」,顺序属于调用者知识
- 几个函数互相传递半成品结构,谁都不完整
- 逻辑只在服务层散落,对象本身没有任何行为
类合并示意
类合并示意
// 之前:散落的函数与来回传递的 reading
base(reading), taxable(reading), total(reading)
// 之后:数据与行为聚在一起,调用方只提出意图
class Reading {
private final ReadingData data;
double base() { return data.kwh * data.rate; }
double taxable() { return base() * taxRate(); }
double total() { return base() + taxable(); }
}
// 调用侧
reading.total();两种形态的选择
| 维度 | Combine into Class | Combine into Transform |
|---|---|---|
| 数据生命周期 | 持续存在、可复用 | 一次流转后丢弃 |
| 中间结构 | 封装为字段 | 显式中间对象 |
| 典型场景 | 领域计算、计费、报表口径 | 导入、导出、批处理管道 |
| 测试方式 | 对类写单测 | 对纯函数写单测 |
合并的前提是「围绕同一份数据」。把调用时机不同、数据来源不同的函数硬塞进一个类,结果是类成为杂物间,随后就会出现下一轮拆分。
Transform 版本要保持纯函数:把读文件、写日志等副作用留在管道两端。一旦变形过程里混入 I/O,就很难对中间结果单独断言。