DDD之3实体和值对象

陈瑞文
• 阅读 2049

DDD之3实体和值对象

图中是一个别墅的模型,代表实体,可以真实的看得到。那么在DDD设计方法论中,实体和值对象是什么呢?

背景

实体和值对象是领域模型中的领域对象,是组成领域模型的基础单元,一起实现实体最基本的核心领域逻辑。

那么问题来了:

1, 他两在领域模型中的作用是什么?

2,在系统中跟代码模型和数据模型是怎么对应的?

搞清楚这两个问题很重要。回答问题是需要有知识基础的,先来捋清楚这两个概念的定义和内涵。然后在小结部分我们来回答这两个问题。

实体

定义: DDD中的一类对象,拥有唯一标识符,经历各种状态变更后仍然可以保持一致,对这类对象而言,重要的是延续性和标识,(对象的延续性和标识可以超出软件的生命周期)而非属性。

形态:不同的设计过程中,形态不一致。 

DDD之3实体和值对象

值对象

定义:通过对象的属性值来识别的对象是值对象,它将多个相关属性组合为一个概念整体。它是没有标识符的对象;
**

特点:值对象描述了领域中的一件东西,这个东西是不可变的,它将不同的相关属性组合成了一个概念整体,当度量和描述改变的时候,它可以用另外一个值对象替换,并进行相等性比较而不会带来副作用;
**
**
简单来说: 值对象本质就是一个集合;
**
意义:领域建模过程中,值对象可以保证属性归类的清晰和概念的完整性;
**
DDD之3实体和值对象
**
**

上图中: 如果把省市区地址放在人员实体中,会显得属性很多很零碎。 推荐的做法是把省市区地址构成一个集合,即地址值对象;

DDD之3实体和值对象

DDD之3实体和值对象

例子:人员地址案例;

DDD之3实体和值对象

缺点:如果实体引用的值对象过多,会导致实体堆积一批缺乏概念完整性的属性,值对象失去了业务含义,操作起来不方便;

实体PK值对象

DDD之3实体和值对象

DDD提倡从领域模型设计出发,而不是先设计数据模型;

小结

首先明确了实体和值对象的概念,以及在不同的设计阶段的形态。然后通过一个例子展示了实体和值对象的概念和使用;

这是一个从业务模型向系统模型落地过程,考验的是设计能力,我们应该结合自己的业务场景,选择合适的方法进行微服务设计。

最后我来回答一下在背景部分抛出的两个问题?

1, 实体和值对象在领域模型中的作用是什么?

2,在系统中跟代码模型和数据模型是怎么对应的?

经过上面的分析,我的回答如下:

DDD之3实体和值对象

希望大家都理解好DDD的实体和值对象,设计出高度灵活的代码;

原创不易,关注诚可贵,转发价更高!转载请注明出处,让我们互通有无,共同进步,欢迎沟通交流。
我会持续分享Java软件编程知识和程序员发展职业之路,欢迎关注,我整理了这些年编程学习的各种资源,关注公众号‘李福春持续输出’,发送'学习资料'分享给你!
DDD之3实体和值对象
点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Wesley13 Wesley13
4年前
SQL利用函数或存储过程求男或女的总分平均分
!(https://oscimg.oschina.net/oscnet/633e11621f3e13e713cf063db00d72c8aa0.png)函数alterfunctionxb(@xingbievarchar(2))returnstableas
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
4年前
Service Mesh 中的可观察性实践
!image.png(https://cdn.nlark.com/yuque/0/2020/png/226702/1590558258356f3e6ea43b18a45ee94c79a5e3f935f9c.png)ServiceMeshVirtualMeetup是ServiceMesher社区和CNCF联合主办的线上系列直播
Stella981 Stella981
4年前
G2Plot 2.0 全新来袭
!统计图表专文.png(https://cdn.nlark.com/yuque/0/2020/png/221520/16059653956224bbaf831eea44f72b3c396221c15002b.pngalignleft&displayinline&height900&margin%5Bobject%20Object%5D
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
4年前
Apache SkyWalking 在 Service Mesh 中的可观察性应用
!ServiceMeshVirtualMeetup(https://cdn.nlark.com/yuque/0/2020/png/1286189/1589857229052fbe701b4ba1a4f3c840829fc9f7b9292.png)ServiceMeshVirtualMeetup是ServiceMesher社
Stella981 Stella981
4年前
O2OA开发平台:(前端)在O2OA中使用系统o2.DL构建弹出框
1、使用O2OA平台封装好对象o2.DL的open方法创建弹出层,传入options参数构建弹出框内容、按钮等元素实现效果:!image.png(https://cdn.nlark.com/yuque/0/2020/png/689690/15918528543063f9ff6b92a2a4e9a82ce704d2f27f3f3.png)
Stella981 Stella981
4年前
Serverless 市场观察和落地挑战
!KubeConChina2019现场图(https://cdn.nlark.com/yuque/0/2019/jpeg/156645/156203332453792398b5f450d4784b3fed482af13a1f9.jpeg)KubeConChina2019大会上, Serverless应用服务正式亮相,在S
Wesley13 Wesley13
4年前
2020 年终总结
!image.png(https://oscimg.oschina.net/oscnet/up718b3b057cfe66f8aad3d33a7b82f5a0.png"image.png")前言2020,过的真快。在这一年里,发生了很多事情。虽然有一些小的成就,也有很多遗憾。正文全年回顾今年主要做了
陈瑞文
陈瑞文
Lv1
朝朝暮暮,沉淀过往,迎来新光。
文章
4
粉丝
0
获赞
0