手把手教你落地 DDD
钟敬
Thoughtworks 首席咨询师、数字化转型与运营团队 DDD 负责人
19697 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
AIGC特别策划 (2讲)
结束语&结课测试 (2讲)
手把手教你落地 DDD
15
15
1.0x
00:00/00:00
登录|注册

20|值对象(下):值对象和实体的本质区别是什么?

你好,我是钟敬。
在前两节课,我们学习了值对象的基本概念、编程实现以及值对象的优点,基本上已经可以开始在实践中应用了。现在我们已经知道,实体是靠独立于其他属性的标识来确定同一性的,而值对象以本身的值来确定同一性,没有独立于其他属性的标识;理论上,实体是可变的,而值对象是不可变的。
但是,还有两个问题没有彻底解决:一个问题是怎么在领域模型里表示值对象;另一个问题更深一点,那就是,实体和值对象有这种区别的根源是什么?如果不理解这一点,在遇到一些疑难问题的时候,仍然无法分辨。
这节课,我们就来解决这两个问题。开始之前,我先提示一下,后面有不少图片和代码,你可以边看文稿边听我说。

UML 的两个知识点

为了讲清楚怎么在模型里表示值对象,我们先要讨论 UML 里的两个知识点。

属性和关联的等价性

第一个知识点是“属性(attribute)和关联(association)的等价性”。这在 UML 里是一个比较深入的原理。
什么意思呢?咱们先来看看后面这个简单的模型图。
这个图的意思是,员工作为组织成员的时候,组织员工之间是一对多的关联。其实这种关联还有另一种画法,虽然形式不同,但意思是一样的。可以看看下面这张图。
看完以后,你是不是觉得有点奇怪。表示关联的线跑哪儿去了?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了领域建模中值对象和实体的本质区别,强调了理解值对象和实体之间的一对多关系的重要性。文章通过讨论UML的两个知识点,解决了如何在领域模型中表示值对象的问题。在实践中,建议在领域模型图里,实体之间的关系用关联来表达,而实体和值对象之间的关系用属性来表达。值对象可以用<<value>>衍型来标识,对于可枚举的值对象,还可以采用UML专门的枚举衍型来表达。实体和值对象的本质区别在于,实体是人通过感官可以感觉到的客观存在的事物,或者以存在的事物为蓝本想象出来的事物;而值对象是为了描述事物,由人抽象出来的纯粹概念。讨论值对象的变化是没有意义的。文章还留下了两道思考题,引发读者深入思考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手教你落地 DDD》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(14)

  • 最新
  • 精选
  • 赵晏龙
    1.值对象还在Domain范围,DTO属于应用范围,风马牛不相及。 2.我觉得有必要,但问的方式应该更加通俗,比如说,A1 A2中有个B属性,A1的B变了A2是否应该跟着变?至于理解是否值对象,实际应用中业务方的学习成本会较高。

    作者回复: 嗯,没错

    2023-02-08归属地:湖南
    6
  • 神经蛙
    牛逼这钱值 比另外一门ddd好多了

    作者回复: 谢谢鼓励!

    2023-03-03归属地:广东
    2
    4
  • Jxin
    内容: 1.巧了,我画领域模型图也会有值对象的缩写。不过我的应用场景是分阶段的,早期可研阶段领域模型的重心是与产品沟通对齐,所以以突出核心模型为主,把其他分支全部隐在属性里。模型的意义是突出重心隐藏复杂。都后面软件建设,要重新划,这个时候是承接上层知识和约束并指导后续软件实现。 2.对于值对象和实体的描述,说得很对。我没在这种维度和团队成员探讨过,如果有实践经验,希望能补充下。我觉得对这块的描述很多说法都对,但关键的还是得看有没有用。这个说法能方便我团队间知识传递吗?这个说法能更好的指导编码实现吗?如果不行,那就只是对。 课后题: 1.反过来可以说是,从本章的内容来看。但没有用,区分dto是否值对象对我实现业务逻辑无帮助。因为如果我的业务逻辑直接依赖dto那本身就是种坏味道。而不依赖,只是传输数据的载体,那管他是啥呢,无所谓。 2.可以,但不建议。能聊沟通信息的厚度能有很大提升,对长期协作有帮助。但对人员的要求太高了,都是流水的兵,这种要求其实也是对特定人的一种高耦合,管理角度看这是一种不稳定。更何况还有干外包的,打一枪放一炮的,还能要求客户水平得如何?

    作者回复: 问题1,值对象其实不是DTO。DTO只负责传输数据,没有业务逻辑,不属于领域对象层面。值对象是领域层面,往往包含业务逻辑。 问题2,一般不和业务人员直接谈值对象。

    2023-01-28归属地:山东
    2
    4
  • 酱油丹
    老师,请教一个问题,按这节课的讲述,工作经验其实也可以认为是值对象?理由如下: 1. 无单独的标识,其所有的属性集合就是自身的标识 2. 也是一个抽象的概念,并不是一个客观存在的事物

    作者回复: 有时候两种观点都可以,取决于理解的角度。为了说得更明白,不妨给工作经验再加一个字符串型的字段“工作经验描述”,用来说明这段工作经验里取得了什么成绩。 这时候,第一种理解是,人员、公司、时间段组成了唯一标识,而“工作经验描述”可以修改,这时候,工作经验是实体。 第二种理解,所有字段都不可修改,如果要修改工作经验描述的话,则替换整个对象。这时候可以理解为值对象。准确的说,这个值对象是该员工某个工作经验信息的“快照”。 两种理解都可以,看你的权衡。

    2023-03-29归属地:广东
    2
    2
  • 龙腾
    1、DTO好像没有严格定义里面有哪些数据吧,可能是实体也可以是一些零碎的属性,或者是实体和一些其他属性的组合。 2、我觉得一般不用刻意强调,对于实体和值对象的基本概念本来就存在于每个人的大脑中。在构建技术模型和实现时可以根据需要加以区分。

    作者回复: 关于第一问,值对象要处理领域逻辑,DTO只是数据传输。第二问非常到位👍🏻

    2023-01-22归属地:河北
    2
  • tt
    我觉得值对象不完全是DTO,因为DTO也可以对应客观存在的事物,或者以存在的事物为蓝本想象出来的事物,只是它不需要有逻辑,所以只剩下了属性。

    作者回复: 是的,值对象通常有业务逻辑,DTO主要负责数据传输,不是业务概念,没有业务逻辑

    2023-01-19归属地:北京
    2
  • 末日,成欢
    老师,读书有一点困惑的地方 我之前对实体的理解是存在唯一标识,并且唯一标识在整个生命周期内不可变,实体的其他属性对于实体来说不重要,是可变的 但是书里说的是ENTITY可以是任何事物,只要满足两个条件即可, 一是它在整个生命周期中具有连续性,这个连续性想要说什么? 书里说的这句话没有前后文,没理解。 还有5.2.1ENTITY最基本的职责是确保连续性,以便使其行为更清楚且可预测 这里的连续性说明的是什么? 麻烦老师解惑下

    作者回复: 我们在微信群里聊过了,再贴一遍: 实体的“连续性”是相对值对象的“不连续性”来说的。两者要比照着理解。先说实体,比如人是实体,张三人这个实体的一个实例。人有身高体重等属性。张三的体重昨天60公斤,今天变成61公斤,也就是体重属性变了,但张三还是张三,并没有变成另一个人,所以说张三(这个实体)具有连续性。另一方面,“重量”是值对象,“5公斤”是重量这个值对象的一个实例,具有两个属性,一个是数值,另一个是重量单位。假如如果5公斤变成6公斤,也就是说数值属性变了,那么6公斤还是原来那个值对象(5公斤)吗?不是了,6公斤是一个新对象。所以说,值对象不具有“连续性”。只要任何一个属性“变”了(其实本质上来说“值对象的属性会变”是一个伪命题),就是另一个值对象了。

    2023-09-16归属地:陕西
    1
  • plimlips
    1.DTO不是值对象,他是技术对象,是领域模型和计算机环境的映射 2.分类一般不用强调,但要把这两种对象都分析出来,分类是有助于领域模型落地的

    作者回复: 回答得非常好,您之前应该对DDD有过研究吧?

    2023-01-25归属地:重庆
    2
    1
  • aoe
    第一个问题本来觉得是一样的,大家都可以是不可变的数据,这不一样吗?但看了老师的答案后才明白: 值对象要处理领域逻辑,DTO 只是数据传输 看来实体、值对象的共同点是:都可以处理领域逻辑

    作者回复: 是的,因为实体和值对象都是“领域对象”,在领域模型图中可以出现。而DTO不是领域对象,在领域模型中不能出现。

    2023-01-25归属地:浙江
    1
  • 神经蛙
    只对象度量了实体的某个属性,把不同相关的属性组成了一个概念整体

    作者回复: 嗯嗯,组成概念整体的值对象就是“复合值对象”

    2023-03-03归属地:广东
收起评论
显示
设置
留言
14
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部