5-4 DDD之战术设计
一、值对象和实体
Value object :从字面理解就是系统中对象的值,描述领域中的重要事物,将相关属性组合为不可分割的单元来对概念整体建模。
特征:
-
(衣服颜色从红色变成蓝色,红色本身是不变的,同理蓝色本身也是不变的,所以颜色是一个值对象)
- 可替换性(红色衣服可以重新上色变成蓝色)
- 可替换性(可以重新赋值给它)
- 可比较性(red == red, red != blue)
- 无副作用的行为
- 线程安全
- 整体性,不仅可以包含数据,还可以包含业务逻辑和校验代码。
,即复杂的业务放在valueObject中,简单的业务放在entity中
不可变性在代码中的体现:
public class ItemNum implements ValueObject<ItemNum> {
private Integer num;
public ItemNum(Integer num) {
this.setNum(num);
}
public ItemNum addNum(ItemNum addNum) {
Validator.validateNotNull(addNum, "addNum is required");
return new ItemNum(this.num + addNum.getNum());
}
// //错误写法(改变了num的值)
// public void addNum(ItemNum addNum) {
// Validator.validateNotNull(addNum, "addNum is required");
// this.num = this.num + addNum.getNum();
// }
...
支持外币的money值对象
image.png
值对象基类:参考实现
Value Object ORM
- 核心
,所以必须要转换
- 顺序:业务优先
- Value Object可以在资料库中有id
- 复杂值对象保存
Entities
定义:是一个不是由属性所定义的对象,它表示了一条有连续性的身份标示线,这条线横跨了系统的生命周期甚至更长。
特性:
- 唯一性
- 容器性
- 跨越性
- 持久性
- 可修改性(和Value Object最大的区别)
设计entity步骤:
- 1分辨业务中那些适合entity,哪些适合放在Value Object中
- 2根据业务规则,识别Entity ID设计方法。(根据上一Page介绍的方法)
*3找出关键行为与对应的业务规则,然后照着Ubiquitous Language命名后使用
Entity和Value Object的区别
- 1系统是否在于对象生命周期的变化
- 2Entity可以拥有Value Object,但Value Object一般不可拥有Entity
- 3是否可修改
二、集合(Aggregate)设计
Entity特征之一:id相同则对象相同
此特性会带来什么副作用?
不同人load一个entity对象进行修改会导致数据不一致,所以外部不能直接调用entity,需要通过Aggregate来调用,保证出口一致。
每一个Aggregate都需要一个entity作为它的Aggregate Root,
特征:
- Aggregate 由Entites和Value Objects组成,这些对象由Aggregate负责统一保存。,
- Aggregate控制修改。
- Aggregate都有一个Root Entity
- Root entity管理Aggregate中其他entities的生命周期
Aggregate设计指导
Aggregate.png
图片2.png
图片33.png
若同时保存两个Aggregate需要发布事件
三、资源库(Repository)和工厂(factory)
Aggregate由Factory来创建,由Repository来保存
图片40.png
四、领域服务和应用服务
Domain Service /Application Service/Infrastructure service
相同点:
- 服务(Service)首先不是事务(Someting),而是行为(Behavior)
-
Service statelessness principle:服务无状态性是一种设计原则,适用于面向服务的设计范式
image.png
五、事件风暴构建领域模型
白板+便签
六、DDD java开源项目
七、推荐使用DDD时机
领导安排