DDD中实体对象与值对象的解释比较抽象。主要根据持续性与 ID 识别来区分。 ID并非某一对象的直观自然属性,而是在分析建模之 后,赋给模型中的实体类,来达到跟踪,区别,存储目的的一个特值。

结合项目实践及 DDD一书中的理论,感觉应该从以下几方面分析:

1.主从:某一概念是主动还是从属性的,如果是从属性的,且这种 从属性的生命周期严格依赖于某实体,如可以考虑成为值对象的候 选。 2. 复用:某一概念是否可以被复用,共享,复制。象对应领域属性, 规格,策略,规则的类,虽然对其他实体类的依赖性不是很强,可以 独立存在。可以被不同的实体对象(不是指类)共享,复制,复用。 如人的地址属性,画笔的颜色字体属性,语言级别如 string字符串。 3. 作用: 3.1 往往是做为临时对象来进行计算,得出同类型的新值对象。来给 实体对象业务使用。如创建查询标准这一临时对象,将此查询标准与 其他查询标准组合,生成新查询标准,给业务应用来进行过滤或查 询。 3.2 创建后做为临时对象来作为实体的业务行为的一个参数,以给业 务行为提供验证检验审核某一规则或是特征之用 3.3 值对象提供的一些组合方法一般满足闭包特征:即 vo.add(VO anotherVO),vo.minus(VO anotherVO)都反回另一值对象。 4.值对象的存储和与其相关联的实体类存储,由实体类来负责实体 类的存储。通过设置实体对类与值类的级联关系。来达到实体类负责 值对象的存储管理。 在我们的项目实际分析设计中,其实不用严格区分实体对象和值对 象,用四色图来分析和理解更易接受。

值对象的作用应该主要集中在两方面:

1. 造成无负作用函数:因为值对象往往是动态生成的临时对象,其 作用主要是提供一个规格或策略或特性而已,所以对实体的类状态 不产生影响。 但一定注意,代表计算,规格,策略或属性的值对象,作用是为实体 对象修改其状态而生成的。也就是说值对象只负责计算改变的值,而 不真正实施改变。而真正的改变由实对象自己调用其他方法来进行。 这样使得计算和改变两个职责解耦,不联系在一起。有几方面好处: 比如可以更改计算或规格策略,而不影响实体类 ; 不用跟踪计算的中 间状态; 中间状态与修改状态无关。所以我们可以放心使用值对象 来计算。因为它并不真正来影响实体类的状态,只是为状态改变提 供值而已。

2. 在类之间关联关系造成存储级联关系时,区分出值对象,可以考 虑存储策略,因此可以提高程序性能(因为可能减少数据库的访问, 减少缓存的压力):比如值对象可能不需要存储和保存,但也可能需 要存储,是否存储由业务决定。 因此我的理解是:分析一个类是否作为值对象,主要应该从以上方 面考虑,而不应该以是否需要存储来作为和实体的本质区别。 同时由值对象是否需要存储而导致了值对象的不同创建策略,如果需 要存储,说明这个值对象代表的规格是需要一再复用的,同时也是可 以配置和修改的,创建采用读写文件形成,有需要的话可以结合反射 技术。如果不需要存储,说明是固化在代码中,对应的计算相对固 定。

[0] DDD领域驱动设计(二) 之 值对象的更多相关文章

  1. [0] DDD领域驱动设计(三) 之 聚合(根)、实体、值对象

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

  2. DDD 领域驱动设计-“臆想”中的实体和值对象

    其他博文: DDD 领域驱动设计-三个问题思考实体和值对象 DDD 领域驱动设计-三个问题思考实体和值对象(续) 以下内容属于博主"臆想",如有不当,请别当真. 扯淡开始: 诺兰的 ...

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

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

  4. DDD领域驱动设计之聚合、实体、值对象

    关于具体需求,请看前面的博文:DDD领域驱动设计实践篇之如何提取模型,下面是具体的实体.聚合.值对象的代码,不想多说什么是实体.聚合等概念,相信理论的东西大家已经知晓了.本人对DDD表示好奇,没有在真 ...

  5. DDD领域驱动设计初探(二):仓储Repository(上)

    前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...

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

    消息场景:用户 A 发送一个消息给用户 B,用户 B 回复一个消息给用户 A... 现有设计:消息设计为实体并为聚合根,发件人.收件人设计为值对象. 三个问题: 实体最重要的特性是什么? Messag ...

  7. C#进阶系列——DDD领域驱动设计初探(二):仓储Repository(上)

    前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...

  8. DDD领域驱动设计初探(三):仓储Repository(下)

    前言:上篇介绍了下仓储的代码架构示例以及简单分析了仓储了使用优势.本章还是继续来完善下仓储的设计.上章说了,仓储的最主要作用的分离领域层和具体的技术架构,使得领域层更加专注领域逻辑.那么涉及到具体的实 ...

  9. DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(2)

    上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext 的实践(1)> 阅读目录: 抽离 IRepository 并改造 Reposi ...

随机推荐

  1. System.map详解

    system.map内容格式为:线性地址类型符号 具体内容如下: 00100000 A phys_startup_32 c0100000 T startup_32 c0100000 A _text   ...

  2. python3 selenium 登录操作

    使用场景: 测试过程中,有的时候需要登录才可以进行其他操作 举例说明: # coding=utf-8 """ :author: 花花测试 :time: 2017.05.0 ...

  3. Java中处理二进制移位

    我相信,这篇文章读起来会相当有趣. 文章中编程语言是Java,用Java的原因:第一,Java不做数据溢出校验,这样我们可以忽略溢出异常:第二,Java普及率比较高,就像是python或shell,几 ...

  4. dotNet Linux 学习记录 - Jexus寄宿WCF服务

    让WCF运行在Linux上(寄宿于服务器程序) WCF介绍请自行 bing 搜索 使用的开发工具为vs2017,系统为 Ubuntu16.04 服务器软件为Jexus ( 详情请看:  Jexus官网 ...

  5. 10、借助POI实现Java生成并打印excel报表(1)

    10.1.了解 Apache POI 实际开发中,用到最多的是把数据库中数据导出生成报表,尤其是在生产管理或者财务系统中用的非常普遍.生成报表格式一般是EXCEL或者PDF .利用Apache  PO ...

  6. webapi “ObjectContent`1”类型未能序列化内容类型“application/xml; charset=utf-8”的响应正文。

    今天在来一发  webapi的一个知识点 相信用过webapi的对这个错误 已经看在眼里 痛在心里了把 我百度也搜了一下  看了一下   然后发现他们的解决办法 并没有什么软用. 然后想起来当时上学的 ...

  7. Unix Shortcuts

    find . -name "*.java" -type f find all the files within a director and its sub-directory e ...

  8. PC端网页的基本构成

    首先,一个前端最基本的就是排网页,有人会看不起拍页面,认为不就是排一个页面嘛,有啥的,分分钟的事,可是他不知道的是,一个网页中也包含了很多内容,像我们如果不理解margin,padding,会经常对我 ...

  9. 用pickle模块实现“增删改查”的简易功能

    pickle的作用: 1:pickle.dump(dict,file)把字典转为二进制存入文件. 2:pickle.load(file)把文件二进制内容转为字典 import pickle # 增 d ...

  10. 【JAVAWEB学习笔记】网上商城实战2:异步加载分类、Redis缓存分类和显示商品

    网上商城实战2 今日任务 完成分类模块的功能 完成商品模块的功能 1.1      分类模块的功能: 1.1.1    查询分类的功能: 1.1.2    查询分类的代码实现: 1.1.2.1  创建 ...