1. 函数长度控制中单一职责原则(SRP)与函数行数(一般 20-50 行)的协同;过长函数的识别与拆分策略
函数长度如何控制?单一职责原则(SRP)与函数行数(20-50 行)如何协同?过长函数的识别与拆分策略?
- SRP 与函数行数的关系
- 过长函数识别(行数、复杂度、多职责)
- 拆分策略(Extract Function)
(1)SRP 与行数:函数应"只做一件事"(SRP),行数(20-50 行)是 SRP 的量化代理。行数超限往往意味着承担了多个职责,但行数不是唯一标准——关键是有没有多个"为什么"。 (2)过长函数识别:a) 行数超阈值(如 >50);b) 有多个缩进层级与多个 if/else 分支;c) 有多个"局部变量堆积"现象;d) 方法名是泛化的(process、handle),无法表达单一职责。 (3)拆分策略:a) 用 Extract Function 把"一个语义单元"提为独立方法;b) 为提取的方法命名,使主函数成为"可读的步骤清单";c) 拆分后主函数应接近"读得像叙事"。 (4)协同:SRP 是原则,行数是度量的线索。两者结合判断"是否过长、如何拆",而非机械地按行数拆。
函数长度控制的核心是 SRP——"只做一件事"。行数(20-50)是量的提示,真正判据是"是否多个职责"。拆分用 Extract Function 把语义单元提出,让主函数成为可读步骤清单。
// 过长:一个函数做多件事
public void saveOrder(Order o) {
if (!validate(o)) throw new ...;
int total = computeTotal(o);
discount = applyDiscount(total, o.getCoupon());
repo.save(o.withTotal(discount));
notify(o);
log("saved", o);
}
// 拆分:每步一个方法,主函数成为步骤清单
public void saveOrder(Order o) {
validate(o);
Money total = computeTotal(o);
repo.save(o.withTotal(total));
notify(o);
}