DDD 学习笔记
1 概念
1.1 领域
领域,指的特定行业或者场景下的业务逻辑。
领域就是用来确定范围的,范围即边界,这也是 DDD 在设计中不断强调边界的原因。
1.2 通用语言,统一语言
通过团队交流达成共识的,能沟简单、清晰、准确描述业务涵义和规则的语言。
1.3 限界上下文(Bounded Context)
- 限界:领域的边界。
- 上下文:语义环境。
电商领域的商品,商品在不同的阶段有不同的术语,在销售阶段是商品,而在运输阶段则变成的货物。同样的一个东西,由于业务领域的不同,赋予了这些术语不同的涵义和职责边界。
限界上下文是一个非常有用的工具,限界上下文可以帮助我们识别出业务的边界,并做适当的拆分。
领域边界就是通过限界上下文来定义的。
1.4 实体
实体对象表示的是具有一定生命周期并且拥有全局唯一标识(ID)的对象。
实体的代码形态
在代码模型中,实体的表现形式是实体类,这个类包含了实体的属性和方法,通过这些方法实现实体自身的业务逻辑。在 DDD 里,这些实体类通常采用充血模型。与这个实体相关的所有业务逻辑都在实体类的方法中实现。
实体的运行形态
每个实体对象都有唯一的 ID。可以对一个实体对象进行多次修改,修改后的数据和原来的数据可能会大不相同。但是,由于它们拥有相同的ID,它们依然是同一个实体。
1.5 值对象
表示用于起描述性作用的,没有唯一标识的对象。
值对象是若干个属性的集合,只有数据初始化操作和有限的不涉及修改数据的行为,基本不包含业务逻辑。
1.6 聚合(Aggregate)
聚合就是由业务和逻辑紧密关联的实体和值对象组合而成的,聚合是数据修改和持久化的基本单元,每一个聚合对应一个仓储,实现数据的持久化。
1.7 聚合根(Aggregate Root)
如果把聚合比作组织,那聚合根就是这个组织的负责人。聚合根也称为根实体,它不仅是实体,还是聚合的管理者。
2 实践
2.1 基于业务的分包
早年的Java分包方式通常是基于技术的,比如与domain包平级的有controller包、service包和infrastructure包等。这种方式当前并不被行业所推崇,而是应该首先基于业务分包。比如,在订单示例项目中,有两个重要的领域对象Order和Product(在DDD中称为聚合根),所有的业务都围绕它们展开,因此分别创建order包和product包,再分别在包下创建与之相关的各个子包。此时的order包如下:
├── order │ ├── OrderApplicationService.java │ ├── OrderController.java │ ├── OrderNotFoundException.java │ ├── OrderRepository.java │ ├── OrderService.java │ └── model │ ├── Order.java │ ├── OrderFactory.java │ ├── OrderId.java │ ├── OrderItem.java │ └── OrderStatus.java
https://insights.thoughtworks.cn/backend-development-iteration0/
创建聚合根 - 工厂(Factory)模式
程序中往往存在多个构造函数用于不同的场景,而为了将业务上的创建与技术上的创建区别开来,我们引入了 create()
方法用于表示业务上的创建过程。
Command 对象
Command即命令的意思,也即写操作表示的是外部向领域模型发起的一次命令操作。事实上,从技术上讲,Command对象只是一种类型的DTO对象,它封装了客户端发过来的请求数据。
统一使用Command对象还有个好处是,我们通过查找所有后缀为 Command
的对象,便可以概览性地了解软件系统向外提供的业务功能。
思考、讨论
结合自己所在项目的业务情况,尝试给业务做一个领域模型分析。可以和项目组人员讨论,使用 ”事件风暴“ 这类工作坊的方式完成领域模型、统一语言、边界上下文。
实体与对象的区别?
结合自己所在项目的某个业务场景,分析出哪些是聚合?
聚合根的理解,与实体的区别?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!