架构思维学习总结(十九)

5-4 DDD之战术设计

一、值对象和实体

Value object :从字面理解就是系统中对象的值,描述领域中的重要事物,将相关属性组合为不可分割的单元来对概念整体建模。
特征:

  • \color{red}{不可变性}(衣服颜色从红色变成蓝色,红色本身是不变的,同理蓝色本身也是不变的,所以颜色是一个值对象)
  • 可替换性(红色衣服可以重新上色变成蓝色)
  • 可替换性(可以重新赋值给它)
  • 可比较性(red == red, red != blue)
  • 无副作用的行为
  • 线程安全
  • 整体性,不仅可以包含数据,还可以包含业务逻辑和校验代码。
    \color{red}{值对象包含业务逻辑实现(通常会有很多ifelse判断,而entity则很少有ifelse判断,判空除外)},即复杂的业务放在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
  1. 核心\color{red}{:领域层的对象与数据库中的对象是不同的东西},所以必须要转换
  2. 顺序:业务优先
  3. Value Object可以在资料库中有id
  4. 复杂值对象保存
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来调用,保证出口一致。
\color{red}{Aggregate是一组关联的entity的组合。}
每一个Aggregate都需要一个entity作为它的Aggregate Root,\color{red}{任何的改变与事件传递,都要先通过Aggregate Root,再传到里面的元件}

特征:
  1. Aggregate 由Entites和Value Objects组成,这些对象由Aggregate负责统一保存。,
  2. Aggregate控制修改。
  3. Aggregate都有一个Root Entity
  4. Root entity管理Aggregate中其他entities的生命周期
Aggregate设计指导

Aggregate.png

图片2.png

图片33.png

若同时保存两个Aggregate需要发布事件
\color{red}{调查pull和push怎么去实现}

三、资源库(Repository)和工厂(factory)

Aggregate由Factory来创建,由Repository来保存

图片40.png

\color{red}{Repository和Aggregate root一一对应}

四、领域服务和应用服务

Domain Service /Application Service/Infrastructure service
相同点:

  1. 服务(Service)首先不是事务(Someting),而是行为(Behavior)
  2. Service statelessness principle:服务无状态性是一种设计原则,适用于面向服务的设计范式


    image.png

五、事件风暴构建领域模型

白板+便签

六、DDD java开源项目

DDD Sample地址

七、推荐使用DDD时机

领导安排

reference:

领域驱动设计DDD实战案例

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容