DDD

DDD系列(一)基础定义

Posted by YaPi on March 3, 2022

定义

DDD是一种软件架构设计方法,并不定义软件开发过程 DDD利用面向对象的特性,以业务为核心驱动,而不是传统的数据库表驱动

  • 模型是对领域的抽象,建模是针对特定问题建立领域的合理模型
  • 复杂性来源于业务本身的复杂性和设计引入的额外复杂性
  • 领域驱动设计通过分解模型和模型驱动设计控制复杂性

解析: 所谓模型即是对特定领域内事物的抽象。比如:人民币。财务情景下,只需抽象为币种和金额。印刷厂情景下,需要 抽象为币种、编号、金额、批次等。在防伪的情景下,需要抽象为币种、金额、防伪材料等。不同情景下需要抽象的内容不一样(第一点)

若现在有一个系统,同时具有财务、印刷、防伪的功能。此时,若用传统面向对象方式建模,就会使人民币这个模型变得很臃肿。随着 业务功能的增加,复杂性不断增加(第二点)

领域驱动设计会通过子域和边界重新分解模型,并提供防腐层来控制复杂性。

面向对象和敏捷与DDD的关系

OOAD (面向对象设计分析) 和 DDD:

区别:OOAD没有战略分析;DDD通过战略设计划分领域和模型。OOAD仅仅用对象描述世界;DDD描述更细致 联系:都是建模和设计的思想

敏捷开发和DDD:

区别:软件开发原始模式是将任务划分成很多个步骤,如:设计、实现、测试等,每个步骤的输出是下一个步骤的输入。这种方式前期的错误在很后期才会发现。 敏捷开发将任务划分为很多个小的任务,每个任务是一个小的冲刺。所以敏捷开发关注流程,DDD关注建模设计方法。

整体流程

  1. 挖掘用户故事
    1. 文字
    2. 讨论
    3. 图像
  2. 建立通用语言,统一描述,比如售卖机,有的又叫做贩卖机。这个时候需要统一名称。
    1. storytelling
    2. 文字、图、代码
  3. 战略设计 - DDD中对问题空间和解决方案空间进行分解的过程,目的是分解模型以控制复杂性,是DDD与传统建模和设计方法的核心区别之一
    1. 领域划分
    2. 限界上下文
    3. 上下文映射
  4. 战术设计
    1. 聚合
    2. 实体和值对象
    3. 工厂和仓库
    4. 服务

参与人员

  1. 产品团队
  2. 领域专家(通常为产品经理)
  3. 研发团队

常用建模方法

  • Domain Storytelling 领域故事陈述法
  • Event Storming 事件风暴法
  • 4C 四色建模法