[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 ...
随机推荐
- JS基础——入门必备
·首先,来简单的说一下,JS是啥,JS是JavaScript的简写,是 基于浏览器的 基于对象的 事件驱动 脚本语言 ·那么JS有什么用呢?ta可以实现: 表单验证 添加动画效果 动态更改页面内容 A ...
- Struts2框架的基本使用(三)
上篇 Struts2框架的基本使用(二)介绍了Action和result的相关配置操作,本篇接着介绍剩下的异常处理机制和Convention插件的使用.下篇文章介绍的是Struts2框架中标签库的使用 ...
- Bash 的若干基本问题
Bash 的若干基本问题 这里介绍一些bash启动前.后的问题,以及一些使用bash需要注意的基本问题. 1.Bash的介绍 Bash是一种Shell程序,它是一般的Linux系统中的 ...
- iOS 详解NSObject协议
协议就是一组接口的集合,遵守一个协议之后就拥有的该协议中所有方法的声明.NSObject这个类遵守了NSObject协议,并且实现了NSObject协议里的所有方法,所以NSObject类及其子类 ...
- static 及 extern
1.static 与 extern 对局部变量的作用 static 和extern 都是用来修饰变量(局部的static 实际也是全局的) static 修饰的变量 只有你的包含那个变量定义的源代码文 ...
- Python学习之路-Day2-Python基础3
Python学习之路第三天 学习内容: 1.文件操作 2.字符转编码操作 3.函数介绍 4.递归 5.函数式编程 1.文件操作 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个 ...
- Github SSH 的key 生成步骤下
Git是分布式的代码管理工具,远程的代码管理是基于SSH的,所以要使用远程的Git则需要SSH的配置. github的SSH配置如下: 一 . 设置Git的user name和email: $ git ...
- 【JAVAWEB学习笔记】08_MySQL&JDBC回顾
今天晨读单词: CRUD:增删改查(create/read/update/delete)create:新增项目read:查询update:修改delete:删除 desc 表名:查看表结构drop:删 ...
- SpringMVC 3.2集成Spring Security 3.2
参考:http://www.cnblogs.com/Beyond-bit/p/springmvc_and_springsecurity.html SpringMVC 3.2集成Spring Secur ...
- JDBC与JNDI的区别
程序员开发时,知道要开发访问MySQL数据库的应用,于是将一个对 MySQL JDBC 驱动程序类的引用进行了编码,并通过使用适当的 JDBC URL 连接到数据库. 就像以下代码这样: Connec ...