关于 tactical-ddd
用于审查、设计和重构丰富领域模型的战术 DDD 技能。它检测贫血模型,将类映射到 DDD 构件,并提供分阶段的重构指导。
主要功能
- 01检测贫血领域模型信号
- 02评估实体、值对象、聚合与领域服务
- 03按顺序执行重构
- 04应用不变条件与聚合设计规则
- 05报告问题或展示前后差异
适用场景
- 01审查代码中的贫血领域模型模式
- 02为领域类选择 DDD 构件
- 03将充斥 setter 的类重构为表达明确的行为
- 04设计边界与领域事件
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ tech-leads-club/ agent-skills --skill tactical-ddd安装后在 Claude Code 中输入/tactical-ddd确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
detection.mdrefactoring.mdreference.md详细介绍
战术 DDD — 丰富的领域建模
工作流
首先确定用户的意图:
| 意图 | 要执行的阶段 |
|---|---|
| “验证 / 审查 / 检查 / 这样对吗?” | 仅执行阶段 1 + 2 → 报告发现的问题,并在重构前征求同意 |
| “修复 / 重构 / 改进 / 清理” | 执行阶段 1 + 2 + 3 |
| “我应该如何设计 / 建模?” | 直接加载 reference.md |
阶段 1 — 检测
加载 detection.md,扫描目标代码中的贫血信号。给出严重程度评分,并列出受影响的类。
阶段 2 — 评估
针对每个受影响的类,确定合适的构件:
| 是否具有随时间跟踪的唯一标识? | 是否具有约束多个对象的不变量? | → 构件 |
|---|---|---|
| 是 | — | 实体 |
| 否 | — | 值对象 |
| 是(根)+ 子对象共享不变量 | 是 | 聚合 |
| 操作跨越多个聚合 / 不属于任何聚合 | — | 领域服务 |
优先使用值对象而非实体。优先使用小型聚合而非大型聚合。
如果意图是验证 / 审查:到此为止。使用下方的输出格式报告发现的问题。继续之前先询问:“您希望我应用这些修复吗?”
阶段 3 — 重构
加载 refactoring.md,按步骤进行修改。按以下顺序执行:
- 将一连串 setter 替换为单个表达力清晰的方法
- 将服务逻辑移入所属的聚合
- 在每个方法开头添加业务守卫
- 每次成功改变状态后发布领域事件
- 将原始类型替换为值对象
对于深入的模式问题(边界设计、事件建模、服务与实体的取舍),加载 reference.md。
快速识别贫血信号(先扫描)
public setX() / public setY() → behaviour should be encapsulated
service.doX(entity, ...) → logic likely belongs in entity
entity.setA(); entity.setB(); ... → setter chain = missing intent method
no domain methods beyond getters → pure data bag
黄金法则
- 行为与数据并存 — 对象同时拥有状态以及改变状态的操作
- 统一语言 — 方法名应源自领域,而非 CRUD(使用
commitTo,而不是setStatus) - 小型聚合 — 默认使用根 + 值对象;只有存在真实不变量时才添加子实体
- 一个事务 = 一个聚合 — 跨聚合规则通过领域事件实现最终一致性
- 通过 ID 引用 — 绝不持有对其他聚合的对象引用
- 优先使用值对象 — 仅在个体身份至关重要时使用实体
- 谨慎使用领域服务 — 服务过多 → 贫血模型
- 保护不变量 — 聚合是最后一道防线;绝不信任调用方
输出格式
审查代码时,报告:
## Anemia Diagnosis: <ClassName>
Severity: [None | Mild | Moderate | Severe]
Issues:
- <description of problem>
Recommended refactoring:
- <specific move from refactoring.md>
重构时,为每个改动过的类展示修改前 / 修改后的差异。
评论
支持 Markdown