mcpField
D
ddd-module-pattern

ddd-module-pattern

github.com/j5ik2o开发8036 次安装27 周前更新
代码仓库

关于 ddd-module-pattern

ddd-module-pattern 是一项面向开发者的技能,指导按领域概念而非技术分类组织领域层包。它提供检查方法和重构指引,帮助提高内聚性并限制变更范围。

主要功能

  1. 01按领域概念组织包
  2. 02识别技术类包名
  3. 03检查内聚性与变更影响
  4. 04提取领域概念的步骤
  5. 05共享与小型领域的指引

适用场景

  1. 01审查领域层包名
  2. 02围绕业务概念重构技术类包
  3. 03将相关领域类型集中放置

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/j5ik2o/okite-ai --skill ddd-module-pattern

安装后在 Claude Code 中输入/ddd-module-pattern确认已加载。

附带文件references/language-guides.md

详细介绍

DDD 模块模式

“模块应反映领域概念,而非技术关注点” — Eric Evans,《Domain-Driven Design》(2003)

核心原则

领域层的包名是通用语言的一部分。

问题:技术驱动的包组织方式

domain/
  entities/           ← ❌ 技術的分類
    Order.java
    Customer.java
  value-objects/      ← ❌ 技術的分類
    Money.java
    OrderId.java
  services/           ← ❌ 技術的分類
    OrderService.java
问题影响
看不出领域结构仅凭包结构无法了解业务形态
内聚性降低相关概念散落在不同文件夹中
变更影响范围扩大更改一项功能就要跨越多个文件夹

解决方案:领域驱动的包组织方式

domain/
  order/              ← ✅ ドメイン概念
    Order.java
    OrderId.java
    OrderItem.java
  customer/           ← ✅ ドメイン概念
    Customer.java
    CustomerId.java
  pricing/            ← ✅ ドメイン概念
    PricingPolicy.java
    Money.java
优点效果
领域可视化包列表 = 领域的主要概念
高内聚相关类型集中在同一包中
局部变更功能变更可在一个包内完成

检测模式

应避免的包名(领域层)
❌ entities/
❌ value-objects/ (valueobjects/, vo/)
❌ aggregates/
❌ services/
❌ interfaces/
❌ impl/
❌ dto/
❌ domain/types/
❌ domain/core/
评审检查清单
  1. 包名测试:业务人员能理解吗?

    • ✅ order、billing、inventory → 业务术语
    • ❌ entities、services、impl → 技术术语
  2. 内聚性测试:它们属于同一业务上下文吗?

    • ✅ 在 order/ 中放置 Order、OrderItem、OrderId
    • ❌ 在 entities/ 中放置 Order、Customer、Product
  3. 变更影响测试:一项业务需求会涉及多少个包?

    • ✅ 1-2 个包
    • ❌ 3 个或更多包

重构步骤

Step 1:提取领域概念
現状分析:
- Order, OrderId, OrderItem → 「注文」概念
- Customer, CustomerId → 「顧客」概念
- Money, PricingPolicy → 「価格設定」概念
Step 2:确定包边界
order/
customer/
pricing/
Step 3:移动并更新引用

将类型移至新包,并更新 import 语句。

Step 4:确认依赖方向
✅ order → pricing (注文が価格計算を使う)
❌ pricing → order (循環の可能性)

各语言指南

详情请参阅 references/language-guides.md。

例外与注意事项

共享内核(Shared Kernel)

多个领域共用的基本类型可以放在共享包中:

domain/
  shared/           ← 許容される例外
    Money.java
    DateRange.java
  order/
  customer/

不过,shared/ 的膨胀是需要重新审视设计的信号。

基础设施层遵循不同规则

领域层以外也可以采用技术驱动的包组织方式:

infrastructure/
  persistence/      ← 技術的分類OK
    jpa/
    redis/
小型领域

少于 10 个类型时,使用单层结构即可。超过后请考虑使用子包。

参考文献

  • Evans, Eric. “Domain-Driven Design”(2003),第 5 章:模块
  • Vernon, Vaughn. “Implementing Domain-Driven Design”(2013),第 9 章:模块

相关技能(建议一并阅读)

使用此技能时,也请参阅以下技能:

  • package-design:模块设计的基础包设计原则
  • clean-architecture:放置领域模块的分层结构
  • domain-building-blocks:模块内构件的设计

评论

支持 Markdown