用途:教授如何构建丰富的领域模型,在编译期防止缺陷,而非在运行期捕获。适用于任何代码评审或设计任务,并为 TDD 周期中的领域评审提供检查原则。
主要能力与实践:
- 避免原始类型偏执:不要用 String、int、number 等原始类型表达领域概念,应创建表达业务含义的类型。评审时标记每个用原始类型表示领域概念的参数、字段或返回类型,修复方式是构造时校验的 newtype 或值对象。
- bool 作为状态的反模式:名称描述领域状态(如 is_published)的 bool 字段是把状态机编码成原始类型,应改用枚举命名各状态。
- Parse, Don't Validate:在边界校验,内部使用强类型,不再重复校验类型已保证的数据。
- 让非法状态不可表示:用类型系统使非法组合无法构造,例如用枚举替代可产生矛盾组合的布尔标志。
- 语义类型优于结构类型:按领域含义命名类型,而非按构成命名,避免同结构类型被互换。
- 标识符使用 newtype:每个标识符独立类型,不用原始 String 或 int。
- 人体工学转换:构造必须经过校验构造器,不提供从原始类型的自动转换;提取应便捷。
- 穷尽匹配:领域状态使用枚举穷尽匹配,不用兜底默认分支。
使用方式:该技能可独立使用;与 tdd 集成时领域评审是强制检查点,与 code-review 集成时领域完整性是三阶段评审的第三阶段,与 architecture-decisions 集成时架构模式影响领域边界位置。缺失依赖可用 npx skills add jwilger/agent-skills --skill tdd 安装。
限制与执行:独立模式为建议性;TDD 领域评审(链式)为建议性,否决由自身执行;TDD 领域评审(子代理)为门控,领域否决会阻止阶段推进。硬约束:不得静默接受违反这些原则的设计,若人类明确覆盖,需记录覆盖及其违反的原则。
验证清单:无原始类型用于领域概念;无 bool 字段编码领域状态;所有标识符使用 newtype;非法状态不可表示;校验发生在构造边界;类型按领域含义命名;同底层类型的两个字段不可被意外互换;枚举匹配穷尽且无兜底默认。若任一条件不满足,应先创建或完善领域类型再继续。