ddd-best-practices 是一个面向领域驱动设计(DDD)的技能包,主要解决“如何建模领域、边界画在哪里、子域之间如何协作”这类问题。它的工作方式是先理解业务问题,再落到技术实现。
一、用途与定位 该技能适用于领域建模、限界上下文划分、聚合与不变量设计、值对象与实体取舍、领域事件建模、仓储设计、上下文集成与防腐层等场景。其核心主张是:从领域问题而非技术构造出发;写代码前先建立统一语言(Ubiquitous Language);聚合保持小规模,作为一致性边界而非便利分组;优先在具有值语义的领域概念上使用值对象;领域事件记录“发生了什么”而非“下一步做什么”;基础设施关注点不得泄漏进领域模型。
二、主要能力
- 设计工作流:领域发现(领域专家是谁、使用什么语言、核心/支撑/通用子域划分、复杂业务逻辑所在)→ 绘制限界上下文(每个上下文一个模型、以团队或能力命名、显式定义上下文关系如合作、客户-供应商、防腐层等)→ 设计聚合(从一条业务命令与不变量出发、仅包含需原子提交或拒绝的状态、单一聚合根控制访问、以标识引用其他聚合、显式化最终一致性、检查生命周期与并发)→ 战术模式建模(实体、值对象、领域服务、领域事件、仓储、工厂)→ 上下文集成(边界处翻译、防腐层、将内部领域事件翻译为稳定集成事件)。
- 启发式判断规则:统一语言变化处即边界;需一起提交或拒绝的业务不变量对象可能属于同一聚合;需要随时间追踪或区分同数据不同实例的是实体,只看值的是值对象;重要领域操作不属于任何实体或值对象时用领域服务但需节制;领域事件用过去式命名并优先具体语义事实;每个聚合根一个仓储,不暴露子实体仓储,报告与部分投影用专用查询模型,外部能力用网关。
- 警示信号清单:贫血领域模型、上帝聚合、限界上下文间共享数据库、统一语言漂移、应用服务承担领域逻辑、仓储返回任意查询或暴露 ORM/查询构造器/SQL 拼接/事务控制、无消费者或兼容理由的通用 CRUD 事件携带完整聚合快照、用例在状态转换后补造领域事件或聚合通过事件总线发布、原始内部领域事件跨上下文而非翻译为版本化集成事件、无文档化不变量的单事务多聚合根修改、公共 setter 或可变子集合绕过聚合根、聚合边界照搬 ORM 关系/UI 屏幕/表结构、全局唯一性规则仅在内存校验而无并发持久化约束。
三、参考文档 技能附带多份参考文档,分别覆盖:聚合发现、边界信号、规则归属、创建与重建、并发、跨聚合协调、持久化与评审清单;仓储语义、契约归属、仓储与 DAO/查询服务/网关之别、缺失、映射、事务、缓存、分页、测试与遗留迁移;事件语义、粒度、载荷/信封设计、聚合记录、创建与重建、集成事件翻译、订阅者与投递边界;术语、归属、生命周期状态或重要领域决策的模型证据;各类战术模式;子域(核心/支撑/通用)、限界上下文与统一语言;上下文映射模式(合作、共享内核、客户-供应商、遵奉者、防腐层、开放主机服务、发布语言);CQRS、事件溯源、事件风暴与流程管理器;六边形架构(端口与适配器、依赖方向、测试策略、Walking Skeleton 实现及与整洁/洋葱架构比较);DDD 实践应用(影响映射、模型探索旋涡、团队拓扑、采用反模式与 PHP 实现示例);领域错误(失败分类与归属、Option vs Result/Either vs 异常选择、稳定错误码、穷尽组合、状态原子性与边界安全翻译);读模型(聚合派生 DTO 与专用读模型、CQRS 查询形态、投影处理器、原子幂等、缺失事件数据、增量更新、影子重建);TypeScript DDD 骨架(按限界上下文划分目录、显式值对象、聚合根/领域事件示例、创建与重建策略、用例结构、CommandBus/QueryBus、Object Mother、Criteria 模式);Go 中 DDD(按上下文划分目录、值对象、未导出字段聚合根、领域事件、仓储接口与实现分离、用例、防腐层、CQRS 查询侧、领域服务)。
四、相关技能 文档建议配合 oop-best-practices(值对象构造、相等性、不可变性、可选性与持久化)、design-patterns-best-practices(领域内 GoF 与企业模式)、refactoring-best-practices(安全演进既有领域模型)、tdd-best-practices(不变量优先的聚合测试、确定性夹具、并发集成测试)、infrastructure-design(事务边界、乐观锁、可靠 Outbox)、rest-api-best-practices(通过 HTTP API 暴露领域并翻译领域错误为状态码)使用。
五、来源与限制 该技能综合自《Domain-Driven Design》(Eric Evans)、《Implementing Domain-Driven Design》《Domain-Driven Design Distilled》(Vaughn Vernon)、《Learning Domain-Driven Design》(Vladik Khononov)、《Patterns, Principles, and Practices of Domain-Driven Design》(Scott Millett & Nick Tune)、《Hexagonal Architecture Explained》(Alistair Cockburn & Juan Manuel Garrido de Paz)、DDD in PHP 社区资源以及 CodelyTV 的聚合、仓储模式、领域事件、领域建模错误课程。资料未提供安装命令、收费标准、价格、支持平台或具体效果数据,这些事实暂未提供。