在进行使用DDD(领域驱动设计)建模的过程中,值对象和实体一直是比较棘手的两个概念,不知道应该怎么划分。今天就从几个角度说一下这个问题。

实体(Entity)是具有唯一标识符(Identity)的对象,通过标识符来区分不同的实体。实体的标识符可以是持久化存储中的数据库主键,也可以是自定义的唯一标识符。实体的重要特征是其标识在对象的生命周期中是唯一且不可变的。实体的状态可以随时间变化,但标识符保持不变。实体之间可以通过比较它们的标识符来进行相等性判断。实体通常具有行为,可以执行某些操作。

例如,电子商务系统中的订单。每个订单都有一个唯一的订单号作为标识符,它区分不同的订单。订单可以随时间变化,比如添加或删除商品、修改收货地址等。但是,无论订单如何变化,它的唯一标识符不会改变。

值对象(Value Object)是没有唯一标识符的对象,它的相等性是基于其属性的值。值对象通常是不可变的,也就是说一旦创建后,它的属性值不可修改。值对象的主要目的是表示一个概念完整的值,而不关注其标识。值对象之间通过比较它们的属性值来判断相等性。

例如,电子商务系统中的商品。商品可以有多个属性,如名称、价格、库存等。在这个系统中,商品被视为值对象,因为它们的相等性是基于其属性的值。如果两个商品具有相同的名称、价格和库存,那么它们被认为是相等的。

区分实体和值对象的关键是理解对象的标识和相等性。实体侧重于对象的唯一标识和标识的不变性,而值对象侧重于对象属性的值和属性的不变性。根据对象在领域中的角色和重要性,我们可以决定将其建模为实体或值对象。

举一个常见的用例:

"Account"(账户)。一个账户可以包含特定金额的货币,并具有相应的行为,比如允许取款、存款等操作。账户实体可能还有其他属性和方法,如账户持有人、账户创建日期等。"Money"值对象可以包含货币的金额和货币类型,它们共同决定了值对象的状态。"Money"值对象通常是不可变的,这意味着一旦创建,它们的状态就不能被修改。通过提供方法来执行货币计算,可以确保在对"Money"值对象进行操作时,创建新的值对象而不是修改现有的值对象。

实体示例:

"Account"实体包含了一个"Money"对象作为余额,并提供了存款和取款方法来改变余额。

public class Account {private UUID id;private Money balance;private String accountHolder;public Account(UUID id, Money balance, String accountHolder) {this.id = id;this.balance = balance;this.accountHolder = accountHolder;}public void deposit(Money amount) {// 实现存款逻辑balance = balance.add(amount);}public void withdraw(Money amount) {// 实现取款逻辑balance = balance.subtract(amount);}// 其他属性和方法...
}

值对象示例:

"Money"值对象表示了一个特定金额和货币类型的货币,它提供了加法和减法的计算方法,返回一个新的"Money"对象作为结果。

public class Money {private BigDecimal amount;private Currency currency;public Money(BigDecimal amount, Currency currency) {this.amount = amount;this.currency = currency;}public Money add(Money other) {// 实现加法逻辑// 注意要检查货币类型是否一致// 返回一个新的Money对象}public Money subtract(Money other) {// 实现减法逻辑// 注意要检查货币类型是否一致// 返回一个新的Money对象}// 其他计算方法和属性...
}

DDD—实体和值对象相关推荐

  1. 怎么把arraylist集合的值放在实体类的属性了_原创 | 使用JPA实现DDD持久化-O/R映射元数据:类级映射-实体和值对象...

    类级映射:实体和值对象 可以被持久化的类包括实体和值对象两大类. 一.实体映射 通过给一个类添加@Entity逻辑注解,告知JPA这是一个可以持久化的实体类. 请注意@Entity逻辑注解不可以继承. ...

  2. DDD 领域驱动设计-三个问题思考实体和值对象(续)

    上一篇:DDD 领域驱动设计-三个问题思考实体和值对象 说实话,整理现在这一篇博文的想法,在上一篇发布出来的时候就有了,但到现在才动起笔来,而且写之前又反复读了上一篇博文的内容及评论,然后去收集资料, ...

  3. DDD中的值对象和实体

    文章目录 背景 定义 举例说明 总结 关于我 背景 在DDD中有两个比较重要的对象,即值对象和实体.而聚合根就是由这两个对象组成的,所以业务建模前我们都会先定义好实体和值对象,然后再构建聚合根,所以再 ...

  4. DDD如何区分实体和值对象

    前言 实体和值对象的区分是领域驱动设计中的老大难问题,建模过程中是必然会遇到的问题,我们在落地领域驱动设计过程中就遭遇了这类问题,下面介绍下我们落地过程中的经验. 实体 实体是指在你这个领域存在的一个 ...

  5. DDD之实体与值对象

    传统的系统架构设计阶段,通常我们会将关注点放在数据上面,而不是领域上面.这种设计风格在软件开发中,使数据库占据了主导地位,我们总是有限考虑数据的属性(对应数据库的列)和关联关系(外键关联),而不是富有 ...

  6. DDD之3实体和值对象

    图中是一个别墅的模型,代表实体,可以真实的看得到.那么在DDD设计方法论中,实体和值对象是什么呢? 背景 实体和值对象是领域模型中的领域对象,是组成领域模型的基础单元,一起实现实体最基本的核心领域逻辑 ...

  7. [Abp vNext 源码分析] - 5. DDD 的领域层支持(仓储、实体、值对象)

    一.简要介绍 ABP vNext 框架本身就是围绕着 DDD 理念进行设计的,所以在 DDD 里面我们能够见到的实体.仓储.值对象.领域服务,ABP vNext 框架都为我们进行了实现,这些基础设施都 ...

  8. DDD—快速理解聚合根、实体、值对象的区别和联系

    聚合根.实体.值对象的关系: 1.实体具有ID,生命周期,状态用值对象描述状态,实体通过ID进行区分是这个实体还是那个实体: 2.聚合根是实体,聚合根的ID全局唯一,聚合根下面的实体的ID在聚合根内唯 ...

  9. 聚合(根)、实体、值对象精炼思考总结

    1.      聚合根.实体.值对象的区别? 从标识的角度: 聚合根具有全局的唯一标识,而实体只有在聚合内部有唯一的本地标识,值对象没有唯一标识,不存在这个值对象或那个值对象的说法: 从是否只读的角度 ...

最新文章

  1. 2020 CCPC-Wannafly Winter Camp Day1 总结
  2. 【小白学PyTorch】4.构建模型三要素与权重初始化
  3. 字符编码以及文件处理
  4. STM32 电机教程 12 - BLDC 闭环电流控制
  5. 如何绘制类似仓库的平面位置图
  6. python def函数报错详解_python所有内置函数的定义详解
  7. 如何在command中使用log
  8. linux awk 区别,awk中RS、ORS、FS、OFS的区别和联系小结
  9. python连接redis002
  10. 分区助手找不到盘_C盘的概述与分区
  11. Spark提交代码的两种方式
  12. Unity3D研究院之mac上从.ipa中提取unity3D游戏资源
  13. vue el-select 默认选中
  14. 用mui索引实现动态数据仿通讯录的功能
  15. 518抽奖软件教程之:公司、单位年会抽奖
  16. 【英语语法】学习路线
  17. 【我的区块链之路】- 理解传统Kademlia和以太坊Kademlia网络
  18. 天津专升本应届生学信网学籍在线验证报告查询下载操作步骤
  19. 机器学习-3:MachineLN之dl
  20. 基于PyQt5实现界面控件自适应大小

热门文章

  1. 纳米技术及纳米二氧化钛在水处理和废水回收中的应用
  2. 在国企搞代码是什么感受?​
  3. Linux 网络编程基础-socket
  4. 从没有人能把MOM异步通信,消息中间件,消息队列?给一次性讲清
  5. 如何为深澜设置自动登录(PPPOE)
  6. 江铖:乳腺癌识别By AI
  7. android气泡聊天消息背景,Android使用贝塞尔曲线仿QQ聊天消息气泡拖拽效果
  8. 怎样注销计算机的用户帐户,怎样注销电脑管理者
  9. win10备忘录怎么固定桌面
  10. 实用计算机技术选修,上海音乐学院附中2013学年选修课程:计算机技术