19|值对象(中):值对象有什么好处?

2023-01-17 钟敬
《手把手教你落地 DDD》
课程介绍


讲述:钟敬

时长:大小13.78M


你好,我是钟敬。
上节课我们讲了值对象的基本概念和编程方法。实体和值对象的差别大体可以总结成这句话:实体是一个“东西”,而值对象是一个“值”,往往用来描述一个实体的属性。
学完前面的内容,不知道你会不会有这样的疑问:我们花了这么大的功夫来区分实体和值对象,那么识别值对象有什么好处呢?今天我们就来聊这个问题。
值对象的优点,主要体现在内存和数据库布局的灵活性上。有了这种灵活性,就可以根据性能、编程方便性等因素,决定值对象的不同实现方式。其次,值对象的不变性也会带来更高的程序质量。这些优点,都是实体所不具备的。
那么,这里说的“布局”指什么呢?我们慢慢讲。先提示一下,后面有不少图片和代码,你可以边看文稿,边听我说。

对象的内存布局

先说内存里的布局,也就是程序运行的时候,对象在内存里是怎么存储的。为了说明这个问题,我们可以利用 UML 的对象图(Object Diagram)来分析。
假如有一个员工,名字叫“张三”,出生日期是“19...

展开全文
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。

精选留言

  • 南山
    2023-01-18 来自江苏
    个人理解嵌入的前提是实体与实体之间一对一关联的时候,要不要嵌入还要再做考虑,比如是否归属同一聚合内,是否经常一起变更等。

    作者回复: 没错

    共 4 条评论
    12
  • py
    2023-02-22 来自上海
    享元模式是Flyweight,不是lightweight

    作者回复: 十分感谢指出这个笔误,我尽快改。

    共 4 条评论
    2
  • 6点无痛早起学习的和...
    2023-02-15 来自北京
    这里有个问题请教一下: 1. 国内还是用 mybatis及mybatis plus 多一些,会根据数据库自动生成单表的 xxMapper 和 xxEntity,所以一般都在仓库的实现层做 xxEntity 和领域对象的转换是吧?不管是 save 、update、select 还是 delete

    作者回复: 是

    
    2
  • H·H
    2023-02-01 来自上海
    值对象也可以以json形式内嵌 我理解实体不能内嵌,如果内嵌就成了另一个实体的值对象了

    作者回复: JSON也是一种可行的方式 内嵌实体的情况比较少,但理论上不能排除这种可能性。

    
    2
  • tt
    2023-01-17 来自北京
    实体不可以采用内嵌的方式吧,因为实体有自己的标识,那么被内嵌到的实体数据如何保存唯一的标识呢?

    作者回复: 假如是一对一的话,是可以考虑嵌入的(但不是一定要嵌入)。这时可以理解为共用同一个标识。

    
    2
  • Geek1560
    2023-10-25 来自上海
    技能和工作经验也可以定位成不可变的,当需要变化时,重建一个即可吧

    作者回复: 仅从技术角度似乎是可以的,关键在于是否正确反映了业务含义。比如说,对于技能,开发人员可以和领域专家聊聊:如果张三有Java技能,3年经验。明年变成了4年经验,这时候,是认为张三掌握了一项新技能,还是只是原有的技能(Java)的经验时长变了,但仍然还是原来那个技能。根据领域专家的回答,就可以做出判断了。

    
    
  • Faddei
    2023-09-10 来自浙江
    请问老师 工作经验和技能 这两个是实体吗?如果是实体的话,这两个又没有唯一的标识符;如果是值对象的话,工作经验和技能又都是可变的。有点搞不懂这两个

    作者回复: 只要可变,那么肯定是实体而不是值对象。对于技能来说“员工ID + 技能类别”就是唯一标识(注意,我没有用“符”字)。实体要求的唯一标识,只需要有一种方法(有可能是联合主键)能够唯一确定这个实体就可以了,不需要一定是单一的ID。

    
    
  • Geek_79f5fb
    2023-05-30 来自浙江
    个人理解,数据库存储共享“地址”,这时候已经把“地址”作为实体看待了,而又在内存层面看成是值对象,中间做的转换感觉是一个伪工作。所以我理解值对象只有非共享模式。

    作者回复: 为什么数据库共享“地址”,就是看作实体了呢?

    
    
  • Sam.张朝
    2023-04-19 来自上海
    用mongoDB json 存储的话,属于自身的,都可以内嵌,如果没有外部关联查询

    作者回复: mongodb 是一种情况。就算用关系数据库,如果是一对一的关系,也可以内嵌

    
    
  • Michael
    2023-03-07 来自陕西
    不共享对象特别是地址这种数据,也是我们正在用的方式,这种方式还有一个不好的地方,就是duplicate太多数据在数据库,导致查询性能降低。所以又渐渐开始共享数据,确实会增加编程复杂性,那么请问老师对于不共享数据造成的查询性能下降有什么解决办法么?

    作者回复: 这要看一下具体的查询场景才能回答。比如利用索引,搜索引擎,还有后面讲的CQRS的一些思路。

    
    