用途:审查并重构代码,让正确性约束由语言提供的最强机制承载,而不是散落各处的运行时防御检查。核心原则是“在边界处校验一次,转换为更强的表示”,使内部代码可信任该结果;对外部、动态、不可信数据的运行时校验仍保留。
主要能力:识别候选不变量与典型信号,如同条件被反复检查、用布尔值编码生命周期或互斥状态、必须同时出现或缺失的可选字段、只在调用另一方法后才有效的方法、“必须先调用 X”之类注释、对已校验值再次校验、允许矛盾字段组合的结构,以及为压住类型检查器而使用的强制转换或忽略注释。
使用方式:先把每个不变量写成一句话;区分为静态内部不变量(应进结构)与动态外部条件(保留运行时检查)。在变更点而非消费端解决,避免 N 个调用点重复同一守卫。再按情景选择表示,如带数据的枚举、可辨识联合、密封类、typestate、newtype、智能构造器、私有字段加不可变与工厂校验,或数据库 Schema 约束。重构时做最小架构改动,边界只解析一次,内部 API 接受强类型,移除新表示下逻辑上不可能的检查,保留并简要说明仍属动态的检查;不要用宽泛转型、any、非空断言或忽略注释强行通过。完成后补测试并运行仓库自身工具链,典型命令如 Rust 的 cargo fmt --all -- --check、cargo clippy --workspace --all-targets -- -D warnings、cargo test --workspace,其他语言使用项目配置的 typecheck、lint、test、build 脚本。
适用场景:代码中反复出现同类守卫、状态机式布尔标志、顺序约束只能运行时发现、字段组合本不可能出现等情况。
限制:不用于给本就简单的代码增加抽象,也不能替代找 bug,它改善表示而非行为;无法表述的不变量应跳过。除上述内容外,官方文档未提供更多细节。