[0] DDD领域驱动设计(二) 之 值对象
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领域驱动设计(二) 之 值对象的更多相关文章
- [0] DDD领域驱动设计(三) 之 聚合(根)、实体、值对象
1. 聚合根.实体.值对象的区别? 从标识的角度: 聚合根具有全局的唯一标识,而实体只有在聚合内部有唯一的本地标识,值对象没有唯一标识,不存在这个值对象或那个值对象的说法: 从是否只读的角度 ...
- DDD 领域驱动设计-“臆想”中的实体和值对象
其他博文: DDD 领域驱动设计-三个问题思考实体和值对象 DDD 领域驱动设计-三个问题思考实体和值对象(续) 以下内容属于博主"臆想",如有不当,请别当真. 扯淡开始: 诺兰的 ...
- DDD 领域驱动设计-三个问题思考实体和值对象(续)
上一篇:DDD 领域驱动设计-三个问题思考实体和值对象 说实话,整理现在这一篇博文的想法,在上一篇发布出来的时候就有了,但到现在才动起笔来,而且写之前又反复读了上一篇博文的内容及评论,然后去收集资料, ...
- DDD领域驱动设计之聚合、实体、值对象
关于具体需求,请看前面的博文:DDD领域驱动设计实践篇之如何提取模型,下面是具体的实体.聚合.值对象的代码,不想多说什么是实体.聚合等概念,相信理论的东西大家已经知晓了.本人对DDD表示好奇,没有在真 ...
- DDD领域驱动设计初探(二):仓储Repository(上)
前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...
- DDD 领域驱动设计-三个问题思考实体和值对象
消息场景:用户 A 发送一个消息给用户 B,用户 B 回复一个消息给用户 A... 现有设计:消息设计为实体并为聚合根,发件人.收件人设计为值对象. 三个问题: 实体最重要的特性是什么? Messag ...
- C#进阶系列——DDD领域驱动设计初探(二):仓储Repository(上)
前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...
- DDD领域驱动设计初探(三):仓储Repository(下)
前言:上篇介绍了下仓储的代码架构示例以及简单分析了仓储了使用优势.本章还是继续来完善下仓储的设计.上章说了,仓储的最主要作用的分离领域层和具体的技术架构,使得领域层更加专注领域逻辑.那么涉及到具体的实 ...
- DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(2)
上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext 的实践(1)> 阅读目录: 抽离 IRepository 并改造 Reposi ...
随机推荐
- SOA与基于CDIF的API的联动
几千年来,巴别塔的故事一直是人类面对的一个核心的困境.为了交流和沟通我们人类创造出语言,但沟通与交流仍然存在障碍……相同语言之间的沟通依语境的不同,尚且存在巨大的鸿沟,不同语言之间更是让人坐困愁城. ...
- AspNetCore-MVC实战系列(四)之结尾
AspNetCore - MVC实战系列目录 . 爱留图网站诞生 . git源码:https://github.com/shenniubuxing3/LovePicture.Web . AspNetC ...
- UIView的属性
.alpha 设置视图的透明度.默认为1. // 完全透明 view.alpha = ; // 不透明 view.alpha = ; .clipsToBounds // 默认是NO,当设置为yes时, ...
- 案例分享|某医药集团的BI建设案例
相比于传统型BI,越来越多的企业开始接受并青睐新型的自助式BI,因其项目上线快,失败风险小,简单易用,颇受赞誉.以下是某医药集团上线帆软BI系统FineBI的案例,从用途架构.指标分析.和信息交互几方 ...
- MNIST机器学习
MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片: 1. MNIST数据集 MNIST,是不是听起来特高端大气,不知道这个是什么东西? == 手写数字分类问题所要用到的(经典)MNIS ...
- GitExtensions-2.48安装详细教程
在安装GitExtensions时你可能遇到如下问题,如果出现此提示,则先退出安装,去下载安装.NET Framework4.0之后,再启动GitExtension的安装. 开始进行安装: 安装完成, ...
- 关于SVN工具的配置及使用
一.在Ubuntu下的配置 1.检测svn是否已经安装过 使用命rpm -qa | grep subversion,如果是一下结果,说明系统已经安装过svn了 如果什么都没有输出,则说明没有安装过sv ...
- ionic之$ionicHistory
$ionicHistory 定义:当用户通过导航栏切换视图页面的时候,ionicHistory起到跟踪视图的作用,类似的浏览器的行为方式,一个ionic应用程序能够保持以前的视图,当前视图,和前视图( ...
- MySQL 主从复制与读写分离概念及架构分析 (转)
1.MySQL主从复制入门 首先,我们看一个图: 影响MySQL-A数据库的操作,在数据库执行后,都会写入本地的日志系统A中. 假设,实时的将变化了的日志系统中的数据库事件操作,在MYSQL-A的33 ...
- javaWeb学习总结(3)- Servlet基础
Servlet的应用 Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的web页面.它担当Web浏览器或其他http客户程序发出请求. 与http服务器上的数据库或应用程 ...