定义
DDD是一种软件架构设计方法,并不定义软件开发过程 DDD利用面向对象的特性,以业务为核心驱动,而不是传统的数据库表驱动
- 模型是对领域的抽象,建模是针对特定问题建立领域的合理模型
- 复杂性来源于业务本身的复杂性和设计引入的额外复杂性
- 领域驱动设计通过分解模型和模型驱动设计控制复杂性
解析: 所谓模型即是对特定领域内事物的抽象。比如:人民币。财务情景下,只需抽象为币种和金额。印刷厂情景下,需要 抽象为币种、编号、金额、批次等。在防伪的情景下,需要抽象为币种、金额、防伪材料等。不同情景下需要抽象的内容不一样(第一点)
若现在有一个系统,同时具有财务、印刷、防伪的功能。此时,若用传统面向对象方式建模,就会使人民币这个模型变得很臃肿。随着 业务功能的增加,复杂性不断增加(第二点)
领域驱动设计会通过子域和边界重新分解模型,并提供防腐层来控制复杂性。
面向对象和敏捷与DDD的关系
OOAD (面向对象设计分析) 和 DDD:
区别:OOAD没有战略分析;DDD通过战略设计划分领域和模型。OOAD仅仅用对象描述世界;DDD描述更细致 联系:都是建模和设计的思想
敏捷开发和DDD:
区别:软件开发原始模式是将任务划分成很多个步骤,如:设计、实现、测试等,每个步骤的输出是下一个步骤的输入。这种方式前期的错误在很后期才会发现。 敏捷开发将任务划分为很多个小的任务,每个任务是一个小的冲刺。所以敏捷开发关注流程,DDD关注建模设计方法。
整体流程
- 挖掘用户故事
- 文字
- 讨论
- 图像
- 建立通用语言,统一描述,比如售卖机,有的又叫做贩卖机。这个时候需要统一名称。
- storytelling
- 文字、图、代码
- 战略设计 - DDD中对问题空间和解决方案空间进行分解的过程,目的是分解模型以控制复杂性,是DDD与传统建模和设计方法的核心区别之一
- 领域划分
- 限界上下文
- 上下文映射
- 战术设计
- 聚合
- 实体和值对象
- 工厂和仓库
- 服务
参与人员
- 产品团队
- 领域专家(通常为产品经理)
- 研发团队
常用建模方法
- Domain Storytelling 领域故事陈述法
- Event Storming 事件风暴法
- 4C 四色建模法