Minimize Reader Load(最小化读者负担)是一条用于评审或塑造难以追踪的代码时采用的原则,来源于 boring-stack。
用途
该原则用于判断代码结构是否难以理解和追踪,并为评审与重构提供依据。它主张可维护性的实质是阅读者理解代码所需付出的工作量。
两个衡量维度
原则提出两个独立的轴:
- 追踪层级(Layers to trace):问题与答案之间隔了多少层间接。
- 状态负担(State to hold):读者必须在脑中记住多少隐藏或可变上下文。
为什么
代码被阅读的次数远多于被编写的次数。LOC、圈复杂度和“整洁架构”都是代理指标,读者负担才是真正重要的事情。这两个轴相互独立:一个包含 50 个全局变量的扁平文件,可能与一个 6 层适配器栈一样难以推理。两者都需要防范。这是 Guard the Context Window 在人类身上的对应物:读者的工作记忆同样是有限的。
模式
- 折叠成本大于收益的层:只有一个调用者的包装器、没有第二实现的适配器、从未被需要的投机性间接,应内联。
- 让相邻层改变抽象:若某层重复相同的方法与参数,只会增加读者负担而不带来压缩,应折叠这类透传层。
- 要求接口压缩:一个宽泛却几乎不隐藏复杂度的接口,会迫使读者同时学习其表面和实现;优先选择能隐藏有意义决策的边界。
- 缩小状态作用域:优先纯函数(返回而非变更)、局部变量而非字段、字段而非模块状态、模块状态而非全局变量;派生而非同步。
- 在边界处命名不变量,而不是在每个消费方重复,让读者只需学习一次。
判断标准
在添加一个层或一份状态之前,先问:这是否在别处减少了至少同等程度的读者负担?
测试方法:新读者能否在 30 秒内回答“X 来自哪里?”和“什么能改变 X?”如果不能,就削减层或削减状态。