DDD之3实体和值对象

图中是一个别墅的模型,代表实体,可以真实的看得到。那么在DDD设计方法论中,实体和值对象是什么呢?
背景
实体和值对象是领域模型中的领域对象,是组成领域模型的基础单元,一起实现实体最基本的核心领域逻辑。
那么问题来了:
1, 他两在领域模型中的作用是什么?
2,在系统中跟代码模型和数据模型是怎么对应的?
搞清楚这两个问题很重要。回答问题是需要有知识基础的,先来捋清楚这两个概念的定义和内涵。然后在小结部分我们来回答这两个问题。
实体
定义: DDD中的一类对象,拥有唯一标识符,经历各种状态变更后仍然可以保持一致,对这类对象而言,重要的是延续性和标识,(对象的延续性和标识可以超出软件的生命周期)而非属性。
形态:不同的设计过程中,形态不一致。

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

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


例子:人员地址案例;

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

DDD提倡从领域模型设计出发,而不是先设计数据模型;
小结
首先明确了实体和值对象的概念,以及在不同的设计阶段的形态。然后通过一个例子展示了实体和值对象的概念和使用;
这是一个从业务模型向系统模型落地过程,考验的是设计能力,我们应该结合自己的业务场景,选择合适的方法进行微服务设计。
最后我来回答一下在背景部分抛出的两个问题?
1, 实体和值对象在领域模型中的作用是什么?
2,在系统中跟代码模型和数据模型是怎么对应的?
经过上面的分析,我的回答如下:

希望大家都理解好DDD的实体和值对象,设计出高度灵活的代码;
原创不易,关注诚可贵,转发价更高!转载请注明出处,让我们互通有无,共同进步,欢迎沟通交流。
我会持续分享Java软件编程知识和程序员发展职业之路,欢迎关注,我整理了这些年编程学习的各种资源,关注公众号‘李福春持续输出’,发送'学习资料'分享给你!
DDD之3实体和值对象的更多相关文章
- DDD 领域驱动设计-“臆想”中的实体和值对象
其他博文: DDD 领域驱动设计-三个问题思考实体和值对象 DDD 领域驱动设计-三个问题思考实体和值对象(续) 以下内容属于博主"臆想",如有不当,请别当真. 扯淡开始: 诺兰的 ...
- DDD 领域驱动设计-三个问题思考实体和值对象(续)
上一篇:DDD 领域驱动设计-三个问题思考实体和值对象 说实话,整理现在这一篇博文的想法,在上一篇发布出来的时候就有了,但到现在才动起笔来,而且写之前又反复读了上一篇博文的内容及评论,然后去收集资料, ...
- DDD 领域驱动设计-三个问题思考实体和值对象
消息场景:用户 A 发送一个消息给用户 B,用户 B 回复一个消息给用户 A... 现有设计:消息设计为实体并为聚合根,发件人.收件人设计为值对象. 三个问题: 实体最重要的特性是什么? Messag ...
- [Abp vNext 源码分析] - 5. DDD 的领域层支持(仓储、实体、值对象)
一.简要介绍 ABP vNext 框架本身就是围绕着 DDD 理念进行设计的,所以在 DDD 里面我们能够见到的实体.仓储.值对象.领域服务,ABP vNext 框架都为我们进行了实现,这些基础设施都 ...
- [0] DDD领域驱动设计(三) 之 聚合(根)、实体、值对象
1. 聚合根.实体.值对象的区别? 从标识的角度: 聚合根具有全局的唯一标识,而实体只有在聚合内部有唯一的本地标识,值对象没有唯一标识,不存在这个值对象或那个值对象的说法: 从是否只读的角度 ...
- 【转载自netfocus博客】聚合(根)、实体、值对象精炼思考总结
1.内容摘要 最近在看DDD领域驱动设计,看到实体(Entity),值对象 (Value Object),以及聚合根(Aggregate Root) 时.对他们的关系有些模糊,不清楚.于是去找了找资料 ...
- 从壹开始微服务 [ DDD ] 之八 ║剪不断理还乱的 值对象和Dto
缘起 哈喽大家周四好,时间是过的真快,这几天一直忙着在公司的项目,然后带带新人,眼看这周要过去了,还是要抽出时间学习学习,这些天看到群里的小伙伴也都在忙着新学习,还是很开心的,至少当时的初衷已经达到了 ...
- DDD领域驱动设计之聚合、实体、值对象
关于具体需求,请看前面的博文:DDD领域驱动设计实践篇之如何提取模型,下面是具体的实体.聚合.值对象的代码,不想多说什么是实体.聚合等概念,相信理论的东西大家已经知晓了.本人对DDD表示好奇,没有在真 ...
- DDD的实体、值对象、聚合根的基类和接口:设计与实现
1 前置阅读 在阅读本文章之前,你可以先阅读: 什么是DDD 2 实现值对象 值对象有两个主要特征:它们没有任何标识.它们是不可变的. 我们举个例子:小明是"浙江宁波"人,小红也是 ...
随机推荐
- Owin Katana 的底层源码分析
最近看了一下开源项目asp.net katana,感觉公开的接口非常的简洁优雅,channel 9 说是受到node.js的启发设计的,Katana是一个比较老的项目,现在已经整合到asp.net c ...
- Kubernetes笔记(三):Gitlab+Jenkins Pipeline+Docker+k8s+Helm自动化部署实践(干货分享!)
通过前面两篇文章,我们已经有了一个"嗷嗷待哺"的K8s集群环境,也对相关的概念与组件有了一个基本了解(前期对概念有个印象即可,因为只有实践了才能对其有深入理解,所谓"纸上 ...
- 原创Go语言题目(基础)
题目内容来源于Go语言的经典书籍<GO编程语言> 题目 选择题 1. 下列说法错误的是:A. main包定义了一个独立可执行的二进制程序,以main函数作为程序执行的入口.B. 没有导入需 ...
- [c++ IO加速]快速输入输出
自己封装的FastIO类,效率虽有所损失,不过实用性提高很多. 测试,写10000000个整数(86M): printf 2.7s cout 27s FastIO 1s 测试,读10000000个整数 ...
- [Vue warn]: Missing required prop: "value"
tips vue中遇到这个问题 真的是很苦恼 一点一点排查 ,最后发现是因为我在 select的option中写了个默认值 ,所以才报这个错误 注释:去掉默认值那个option 选项就不报错了
- 以前的一些word的整理
LAMP部署 环境:虚拟机centos7 安装apache: 命令:yum install -y httpd (在执行这个命令时,可能会遇到运行yum时出现/var/run/yun.pid已被锁定,P ...
- Lr运行错误Error: Socket descriptor not found. Hint: the problem might be
在controller中,运行时,报如下错误“Error: Socket descriptor not found. Hint: the problem might be solved applyi ...
- jquery监听input
$(function(){ //输入框正在输入时 $("#ipt").on('input',function(){ if(!($('#ipt').val()=='')){ $(&q ...
- Linux系统如何安装qt-desinger
前言:最近想在python3.7.3下玩下PyQt5,写UI有两种方式一种是使用手写,第二个就是使用Qt Designer工具来写,所以首先就是安装PyQt5和pyqt5-tools工具了. 一.安装 ...
- 浅谈产品模型(Profile)在程序设计中的作用
引言:物联网平台的一个重要功能就是资产管理,产品或者设备都可以看成是资产中组成部分,所以有时候说物联网平台可以进行产品管理和设备管理.通常应用物联网平台开发一套具有产品或者设备管理功能的系统的时候,必 ...
