# 模块 3:Rule 的设计契约
Rule 不是“代码要规范”这类口号。 一条可执行 Rule 必须说明:它基于什么证据、在哪些场景生效、必须做什么、不能做什么,以及如何验收。
来源可信
边界明确
结果可验
--- # 先给 Rule 标注证据等级
| 等级 | 什么时候使用 | 典型写法 | |---|---|---| | 硬约束 | 配置、构建、CI 或显式规范直接证明 | 必须 / 禁止 | | 观察性约束 | 多处源码反复出现,但没有书面规范 | 默认采用 / 优先复用 | | 待确认约束 | 对交付很重要,但当前项目无法证明 | 需确认 / 不下结论 |
不要把“一个代码样例”或“通用最佳实践”直接升级成项目硬规则。
--- # 一条 Rule 的六个字段
```md ## 状态变更必要信息保护 - 级别:观察性约束 - 适用场景:Service 方法会写入业务状态或释放、占用资源。 - 必须:在任何写入前校验本次状态变更必需的信息。 - 禁止:仅依赖前端必填;将条件必填扩大为全表非空。 - 来源证据:状态更新、资源更新与现有调用链。 - 验收方式:无效输入被拒绝;正常路径及副作用单独验证。 ```
--- # 常见的 Rule 失效方式
| 写法 | 为什么失效 | 改写方向 | |---|---|---| | “后端要做好校验” | 没有触发点、位置和验收 | 指出状态写入前的必要信息保护 | | “所有字段都不能空” | 把条件规则扩大为数据模型规则 | 写清具体状态与字段条件 | | “统一使用 Service” | 把架构偏好误当业务约束 | 说明为什么该规则需要覆盖复用入口 | | “严格测试” | 无法判断是否满足 | 写出无效输入、正常路径和副作用验证 |
好的 Rule 约束行为,不替人猜业务,也不替项目做架构重写。
--- # Rule 的验收不是“读起来像规范”
能触发
知道什么时候应用
能约束
必须与禁止清楚
能取证
来源不是主观偏好
能验证
可用代码、测试或检查确认