一、什么是领域驱动设计DDD
领域驱动设计(Domain-Driven Design,DDD)是一种软件开发方法论,它提出了一组关于如何设计和构建软件系统的原则和方法。
二、DDD的诞生是为了解决哪些问题
- 对复杂业务领域的理解不足:传统的软件开发方法往往偏重于技术层面,忽视了对业务领域的深入理解。这导致开发人员无法准确地理解和建模复杂的业务逻辑,导致软件系统与实际业务需求不匹配。
- 软件系统的可维护性差:在传统的软件开发方法中,由于缺乏对业务领域的深入理解和建模,软件系统往往变得难以维护和扩展。当业务需求变化时,开发团队需要花费大量时间和精力来理解系统的结构和逻辑,导致维护成本高昂。
- 建模与编码之间的鸿沟:传统的软件开发方法往往将建模和编码视为两个独立的活动,导致建模与编码之间存在鸿沟。开发人员往往需要将建模文档翻译成代码,这容易导致建模的失真和代码与模型的不一致。
三、DDD领域驱动设计对比传统设计的优势
DDD领域驱动设计 | 传统设计 |
---|
领域切分 (可更好的专注于技术或业务) | 架构以技术为中心的,往往无法完全实际业务需求 |
高度可维护性和可扩展性(领域之间的彼此影响降到了最低) | 结构可能过于复杂,难以维护和扩展 |
更好的团队合作和沟通(领域切分,层次更清晰) | 团队成员可能对整个系统的理解不一致,导致沟通困难 |
更容易进行交叉领域的协作和集成 | 难以实现不同领域之间的协作和集成 |
更好的对业务知识的抽象和建模(业务与技术进行了一定的隔离) | 可能无法准确地反映业务需求 |
四、领域的划分(我们公司是按下面四个层次)
领域层次 | 功能 |
---|
接口层 | 暴露领域模型给应用程序和外部系统 |
| 转换和验证外部入参 |
| 处理与外部系统的通信、身份验证、授权等非功能需求 |
| 提供清晰的接口,与外部系统进行交互 |
应用层 | 协调领域模型的操作 |
| 处理应用程序的用例逻辑 |
| 控制领域模型的生命周期 |
| 处理外部请求,将其转换为领域模型理解的格式 |
领域层 | 包含领域模型的核心业务逻辑 |
| 定义领域对象、值对象、聚合根等领域概念 |
| 实现领域模型之间的关联、约束和业务规则 |
| 封装领域模型的状态和行为 |
基础设施层 | 提供与外部系统的交互和数据持久化支持 |
| 实现领域层定义的接口,将领域模型持久化到数据库或其他存储介质 |
| 处理与外部系统的集成,如消息队列、缓存、文件系统等 |
| 提供外部资源的访问和管理,如文件、网络连接等 |
五、DDD的专有名词及释义
专有名词 | 解释 |
---|
实体 (Entity) | 领域模型中具有唯一标识的对象,具有自己的属性和行为,有独立的生命周期。 |
值对象 (Value Object) | 描述领域中某个特定概念或属性的对象,无需唯一标识,通常是不可变的。 |
聚合 (Aggregate) | 一组相关的实体和值对象的集合,由聚合根负责维护和管理内部一致性,是一个逻辑上的单元。 |
聚合根 (Aggregate Root) | 聚合的根实体,其他实体和值对象的访问入口点,负责维护聚合内部的一致性和约束。 |
工厂 (Factory) | 创建领域对象的对象,封装了创建过程,提供了统一和可控的方式来创建领域对象。 |
仓储 (Repository) | 封装对领域对象的持久化操作,提供了创建、更新、删除和查询等操作的接口,隐藏了数据访问细节。 |
领域事件 (Domain Event) | 表示领域模型中发生的重要事情的对象,用于表示领域内部的状态变化或领域模型之间的交互。 |
领域服务 (Domain Service) | 封装领域中的复杂业务逻辑,不属于任何具体的实体或值对象,通常用于处理跨多个聚合的操作。 |
值对象的不变性 (Immutability) | 值对象在创建后不可被修改,任何改变值对象的操作都应该返回一个新的值对象,而不是修改原始对象。 |
领域驱动设计 (Domain-Driven Design, DDD) | 一种软件开发方法论,以领域模型为核心,通过将业务问题映射到软件模型来解决复杂业务场景,强调领域专家与开发团队的合作和共同理解。 |