显式状态与不变量Explicit state and invariants

为重要状态设置明确表示,规定修改前后必须成立的关系。

核心约束
所有修改入口共同维护同一组约束,例如 0 ≤ 已用长度 ≤ 容量。
适用问题
二进制缓冲区、对象生命周期、缓存状态与协议解析。
边界与取舍
冗余状态可能不同步;绕过封装会使原有不变量失效。

常见操作#

以 Redis SDS 保存 len、alloc 和终止符为例;n 为字符串长度。

操作时间成本条件与说明
读取长度 / 剩余容量O(1)O(1)从明确维护的元数据读取,无需每次扫描内容。
追加内容并更新状态拷贝新增内容 + 必要扩容必须同时维护长度、容量和终止符;不能只更新其中一个字段。
核验不变量按检查内容计费局部边界可常数检查;验证整个结构一致性可能需要遍历。

实施成本#

时间成本
新增元数据可省重复扫描,但更新时必须维护
空间成本
长度 / 容量等元数据及可选冗余状态

这是一种设计方法而非独立算法。额外状态也可能因更新遗漏而失真,需在变更入口集中维护并用测试验证。

工程中的应用#

1 个案例 · 附源码
原始实现与接口资料

Redis 7.2 · sds.h显式长度和容量、sdslen 与 sdsavail。

Redis 7.2 · sdscatlen追加时扩容、复制、长度更新和终止符维护。

5 个概念