用途:这是一条软件设计与代码评审原则,用于审视或塑造难以追踪的代码。它把可维护性定义为“读者理解代码所需付出的工作”,并主张 LOC、圈复杂度、“整洁架构”等只是代理指标,真正重要的是读者负担。
主要能力:从两个相互独立的维度衡量代码。一是追踪层数,即问题与答案之间的间接层次;二是状态负担,即读者必须在脑中保留的隐藏或可变上下文。两个维度各自独立,都要防范:一个含 50 个全局变量的扁平文件,与一个 6 层适配器栈,可能同样难以推理。
使用方式:折叠代价大于收益的层,例如只有一个调用者的包装器、没有第二种实现的适配器、从未被需要的推测性间接层,直接内联。让相邻层改变抽象,若一层只是重复同样的方法与参数,属于透传层,应合并。要求接口压缩:宽接口隐藏的复杂度很少,会迫使读者同时学习表面与实现,应偏好隐藏有意义决策的边界。缩小状态作用域,优先纯函数(返回而非修改)、局部变量优先于字段、字段优先于模块状态、模块状态优先于全局变量,并派生而不是同步。在边界处命名不变量,而非在每个使用方处重复,让读者只学一次。在新增层或状态前先问:它是否至少等量地减少了别处的读者负担。
检验标准:新读者能否在 30 秒内回答“X 从哪来”“什么能改变 X”。若不能,就削减层或削减状态。
适用场景:代码评审、重构、架构决策,尤其是难以追踪来源与可变状态的代码。
限制:资料未提供具体的强制工具、代码示例、语言适用范围、性能或收费信息;该原则是启发式判断,折叠与保留的取舍需要结合实际上下文。