领域事件驱动DDD(一) 值对象以及实体

对领域事件驱动的一些知识的梳理(以下内容是从内到外进行梳理)
在这里插入图片描述

值对象:一个没有标识符的对象。

值对象通常不会被修改,而是通过创建新的值对象来表示不同的状态。
没有自己的生命周期,它们随着所属的实体或聚合根的生命周期而存在。它们更多地用于描述和表示数据,而不是行为。

订单作为聚合根,而其中的一些属性可以被抽象为值对象。例如,收货人信息可以被封装成一个值对象。

public class ShippingAddress {
    private String street;
    private String city;
    private String state;
    private String postalCode;
}

通过使用值对象ShippingAddress,我们可以将收货人信息与订单关联起来,同时减少代码的冗余和复杂性。

public class Order {
    private String orderNumber;
    private LocalDateTime orderDate;
    private BigDecimal orderAmount;
    private ShippingAddress shippingAddress;
}

实体:

实体应该是富有业务行为且具有唯一标识符的对象。在不同的设计阶段实体是可以改变的,但是根据唯一标识符始终能定位到这个唯一对象。

贫血模型

贫血模型是指领域对象里只有get和set方法(POJO),所有的业务逻辑都不包含在内而是放在Business Logic层。

充血模型

充血模型是指数据和对应的业务逻辑被封装到同一个类中。因此,这种充血模型满足面向对象的封装特性,是典型的面向对象编程风格。

引入新的问题
什么样的逻辑应该放在Domain Object中,什么样的业务逻辑应该放在Business Logic中?

Rod Johnson提出原则是“case by case”,可重用度高的,和domain object状态密切关联的放在Domain Object中,可重用度低的,和domain object状态没有密切关联的放在Business Logic中。

把一个logic放到domain object中以后,这个domain object应该仍然独立于持久层框架之外,这个domain object仍然可以脱离持久层框架进行单元测试,这个domain object仍然是一个完备的,自包含的,不依赖于外部环境的领域对象,这种情况下,这个logic才是domain logic。

public class Order {
    private String orderNumber;
    private LocalDateTime orderDate;
    private BigDecimal orderAmount;
    private ShippingAddress shippingAddress;
     // 封装业务行为
    public void cancelOrder() {
        // 执行取消订单的逻辑
    }
    
    public void updateShippingAddress(ShippingAddress newAddress) {
        // 执行更新收货地址的逻辑
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值