抽象层次一致性是什么
函数与模块内部应保持在同一抽象层次:高层编排与底层位运算混排会打断阅读节奏,读者要不断切换思考粒度。这不是硬性规范,而是一条可操作的自检——「每行代码是否与函数名处于同一语气层次」。提炼函数是最常用的校正手段,配合命名让层次显式化。
基本信息
| 信号 | 一行调用高层步骤,下一行处理字节或字符串下标 |
|---|---|
| 校正 | 把低层细节提炼成有名字的函数 |
| 检验 | 每行是否与函数名同一语气层次 |
| 注意 | 过度提炼会得到一串空壳函数,反而更难读 |
识别与校正
- 函数里出现位运算、字节偏移、字符串下标这类细节,而函数名是业务动作
- 同一函数里既有「校验订单」又有「遍历数组交换元素」
- 循环体做的是算法细节,而外层函数名为流程步骤
- 错误处理混在流程描述中间:先提炼为独立的失败路径函数
- 日志与度量语句夹在业务语义之间:抽到切面或单独方法
- 层次统一后函数变短,但每行都读得懂
层次混排与校正
层次混排与校正
// 之前:render 里混着业务步骤与字节细节
void render(Page page) {
layout(page);
for (int i = 0; i < page.raw.length; i++) {
out.write(page.raw[i] & 0xFF); // 抽象层次骤降
}
}
// 之后:每一行都是同一层次的步骤
void render(Page page) {
layout(page);
paint(page); // paint 内部才处理字节细节
flush();
}信号与校正手法
| 信号 | 校正手法 | 注意 |
|---|---|---|
| 业务步骤里夹位运算 | 提炼为语义方法 | 方法名要说明做什么 |
| 流程中夹循环细节 | 提炼为集合操作 | 保留可读的中间命名 |
| 注释在解释「做什么」 | 把该动作提炼成函数 | 注释留给「为什么」 |
| 函数名与实现粒度不符 | 改名或提炼 | 改名优先,成本最低 |
层次一致性是评审时很好用的提问:「这一行和函数名说的是同一件事吗?」答案是否就说明该提炼。它比讨论风格更客观,也不会演变成命名偏好之争。
层层提炼到空壳函数就过度了:如果提炼出来的方法只有一个调用点、方法体只有一行、名字与调用处几乎重复,那就没有必要存在。判断标准是它是否让读者少想一层。