论坛首页 Java版

关于实体与值对象

浏览 1137 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2006-10-21
DDD的思想否定了我们之前建立实体类的做法,主张把原来的实体类分为实体与对象。DDD一书中的定义是:
1.“以标识作为其基本定义的对象称为实体”;
2.“如果一个对象代表了领域的某种描叙性特征,并且没有概念性的标识,我们就称之为值对象”。

但是对于二者的区别与划分我仍然没有弄清楚,我的理解是:首先,实体有唯一性的标识,定义实体的时候也只取那些可以用来标识对象,用来区分、查找、匹配对象的属性和方法,其他的都转移到其他的对象中,通常是值对象中。再者,实体是需要持久化支持的。而值对象不同,值对象没有标识,其不同的实例是不需要严格区分的,是可以被共享、重用的,也不需要持久化。

我的问题是:
1. 从类与对象的角度来说,值对象也需要定义为类,运行过程中也会产生不同的实例,这些实例的使用都不需要区分吗?可以随意交换使用吗?
2. 值对象不需要持久化,是不是可以理解成值对象的所有信息都是可以从实体中获取的?但是值对象的信息都是从实体上剥离出来的,又如何从它身上获取呢?

请指教。
   
最后更新时间:2006-10-21
第一个问题,回答是“是“。所以如果用Java,值对象的类要重新定义equals和hashCode方法。JDK中的值对象类的例子有String, Date, BigDecimal等。

"值对象不需要持久化",请给出这句话的出处,如果是英文请给出原文。
值对象一般作为实体对象的属性。实体对象持久化时,作为起属性的值对象自然也要持久化。
   
0 请登录后投票
最后更新时间:2006-10-22
DDD一书中并没有明确的说明“值对象不需要持久化”,是我从里面的第七章的例子得出的理解,里面在设计仓储的时候只对几个聚合根实体进行了仓储设计,象Delivery Specification等值对象都没有进行仓储设计。

我也正是迷惑,或者是我没有理解清楚例子的意思。不需要标识进行区分但是存在对象的重建也应该一样需要仓储的支持。

回过头来,具体化一点,如果为值对象设计仓储,为一个值对象设计一个数据库表进行存储,那么,既然值对象本身是不进行区分的,值对象也会存在多个不同实例,对应到数据表中就是多条记录,这多个实例又如何对应到数据表中的记录呢?值对象是不需要进行标识区分的。
   
0 请登录后投票
最后更新时间:2006-10-22
wczwcg 写道
DDD一书中并没有明确的说明“值对象不需要持久化”,是我从里面的第七章的例子得出的理解,里面在设计仓储的时候只对几个聚合根实体进行了仓储设计,象Delivery Specification等值对象都没有进行仓储设计。

我也正是迷惑,或者是我没有理解清楚例子的意思。不需要标识进行区分但是存在对象的重建也应该一样需要仓储的支持。

回过头来,具体化一点,如果为值对象设计仓储,为一个值对象设计一个数据库表进行存储,那么,既然值对象本身是不进行区分的,值对象也会存在多个不同实例,对应到数据表中就是多条记录,这多个实例又如何对应到数据表中的记录呢?值对象是不需要进行标识区分的。
举个“值对象也会存在多个不同实例,对应到数据表中就是多条记录”的具体例子来讨论。
   
0 请登录后投票
最后更新时间:2006-10-25
引用
举个“值对象也会存在多个不同实例,对应到数据表中就是多条记录”的具体例子来讨论。

就拿书中的例子,那个货物运输系统。每个cargo都有其特定的delivery specification。作者认为这个specification是个值对象。
   
0 请登录后投票
论坛首页 Java版

跳转论坛:
JavaEye推荐