1907 字
10 分钟
Ddd
DDD 领域驱动设计
关于 DDD
领域驱动设计(Domain-Driven Design,DDD)是一种软件设计方法,是一种思想,它以领域为核心,将软件系统拆分为不同的领域,并在不同的领域中建立模型和规则。通过这种方式,可以提高软件系统的可维护性和可扩展性,并减少软件系统中的错误。
在我们以前的后端项目的开发过程当中,软件架构的设计往往是在项目开始之初就确立的,可是在实际的项目开发当中,我们往往发现,架构设计往往是在项目后期才逐渐完善起来的,这往往是因为项目初期对业务的理解不足,或者对软件架构的设计不够清晰,导致架构设计不够合理,最终导致软件系统的可维护性和可扩展性越来越差,而这个时期再开始考虑项目拆分的时候就会因为 MVC 架构各种复杂的调用关系而难以下手。
DDD 的出现就是为了解决这个问题,它将软件系统拆分为不同的领域,并在不同的领域中建立模型和规则,从而提高软件系统的可维护性和可扩展性,并减少软件系统中的错误,刚接触到一个新的领域可以引用事件风暴的方式。事件风暴(Event Storming)是一种由 Alberto Brandolini 在 2013 年提出的工作坊方法,旨在帮助团队在短时间内对一个复杂领域进行建模和理解,帮助跨职能团队通过讨论和协作,快速发现和识别领域中的关键事件和业务流程。
事件风暴
事件风暴的核心思想是通过可视化事件流来揭示业务领域中的重要行为和互动。以下是事件风暴的一些关键特点和步骤:
关键特点
- 高度协作:事件风暴强调团队成员之间的互动和协作,通常包括开发人员、业务专家、产品经理等不同角色。
- 快速迭代:通过快速生成和调整事件模型,团队能够在短时间内捕捉到领域的复杂性。
- 可视化:利用便利贴和白板等工具,将事件以可视化的方式展示出来,便于讨论和理解。
- 领域驱动:专注于业务领域中的实际事件和流程,而非技术实现细节。
步骤
- 准备工作:确定讨论的主题和范围,邀请相关领域的专家和团队成员,准备好便利贴、白板或大张纸。
- 标识事件:在白板上记录领域中的关键业务事件,每个事件用一张便利贴表示,事件通常以过去时态动词短语描述(例如,“订单已创建”)。
- 排列事件:将事件按照时间顺序排列,展示业务流程的先后顺序。
- 识别命令:识别触发这些事件的命令或操作(例如,“创建订单”),并将其添加到模型中。
- 添加参与者:识别执行这些命令的参与者(角色或系统),并将其添加到模型中。
- 讨论和细化:通过团队讨论,细化和调整事件模型,添加更多的细节和上下文。
- 识别聚合根和界限上下文:在详细讨论中,识别出领域中的聚合根和界限上下文,帮助进行更细化的领域建模。
通过事件风暴,团队可以在一个开放和互动的环境中,高效地探索和理解复杂的业务领域,进而为后续的设计和开发工作打下坚实的基础。
核心概念
- 领域(Domain):领域是软件系统所要解决的问题域,它包含了软件系统所需要处理的业务逻辑和规则,在理解的基础上,我们可以把它看作是一种边界。
- 模型(Model):模型是领域中的实体、值对象和领域服务,它们是领域中最重要的概念,它们定义了领域中的业务逻辑和规则。
- 领域服务(Domain Service):领域服务是领域中的辅助服务,它们提供了一些通用的功能,例如查询、验证等。
- 聚合(Aggregate):聚合是领域中的一个概念,它将相关的实体和值对象组合在一起,形成一个完整的业务单元。
- 仓库(Repository):仓库是领域中的一个概念,它负责存储和检索领域中的实体和值对象。
- 领域事件(Domain Event):领域事件是领域中的一个概念,它表示领域中的一个事件,例如订单创建、订单支付等。
- 领域服务(Domain Service):领域服务是领域中的一个概念,它提供了一些通用的功能,例如查询、验证等,它只负责组装场景而不提供实现,实现交给领域实体自己来做。
- 充血模型(Rich Domain Model):充血模型是一种面向对象的设计思想,它将领域中的业务逻辑和规则封装在在模型实体中。
- 贫血模型(Anemic Domain Model):贫血模型是一种面向对象的设计思想,它将领域中的业务逻辑和规则封装在领域模型中,而不是在模型实体中。
- 工厂(Factory):工厂是领域中的一个概念,它负责创建领域中的实体和值对象。
- 值对象(Value Object):值对象是领域中的一个概念,它表示领域中的一个不可变的数据对象。
- 实体(Entity):实体是领域中的一个概念,它表示领域中的一个可变的数据对象。
- 聚合根(Aggregate Root):聚合根是领域中的一个概念,它表示领域中的一个聚合的根实体。
- 防腐层(Anti-Corruption Layer):防腐层是领域中的一个概念,它负责封装领域模型和外部系统之间的交互,从而减少对外部系统的依赖。
借鉴思想
DDD 应该一直遵循高内聚低耦合的目标,可以借鉴以下原则:
- 单一职责原则:在领域模型中,每个模型都应该只有一个职责,即应该只有一个原因导致模型发生变化。
- 开闭原则:在领域模型中,应该尽量使用抽象和接口,而不是具体的实现,这样可以提高模型的可扩展性和可维护
- 依赖倒置原则:在领域模型中,应该尽量使用抽象和接口,而不是具体的实现,这样可以提高模型的可扩展性和可
四层架构
在 DDD 中,通常会使用四层架构来组织代码。这四层架构分别是:
- 领域层(Domain Layer):领域层是领域模型的核心,它包含了领域中的业务逻辑和规则。
- 应用层(Application Layer):应用层负责协调领域层和基础设施层之间的交互,它负责处理应用程序的输入和输出。
- 基础设施层(Infrastructure Layer):基础设施层负责提供基础的服务和设施,例如数据库、缓存等。
- 表示层(Presentation Layer):表示层负责处理用户界面和用户交互,它负责将应用程序的输出展示给用户。