DDD中实体对象和值对象的区别困惑?

10-01-27 dongnan99
         

最近在看DDD,对其中描述实体和值对象的区别有点困惑。“实体是可变的,而值对象是不可变的”对值对象的说法有些不明白,是说值对象一旦创建了就不能改变值对象中的属性的值么?另外作者说在一些性能领域值对象可以复用,但又说值对象不能改变。这说法是否是冲突的?这个不能改变到底是不能改变什么? 我的想法是如果一个值对象要被共享,那么它的值应该不能被改变。如果不需要被共享,那么它就应该可以被改变。不知道理解的对否。请教各位达人。

[该贴被dongnan99于2010-01-27 17:44修改过]

         

2
banq
2010-01-28 10:23

2010年01月27日 17:29 "dongnan99"的内容
是说值对象一旦创建了就不能改变值对象中的属性的值么

是的,要注意用词,值对象不能改变其内部值,但是其整体是可以被替换的。

就象一个单位,你不能改变单位中某个人或事物,但是你可以更换另外一个单位合作。

如果值对象和实体发生关系,一般从属于这个实体,作为实体来讲,你可以更换另外一个值对象作为你的新值对象,就是可以更换关系,但是不可以更换值对象内部值。

xiaobruce
2010-01-28 18:25

LZ记着一句话:这个世界是事实和事物的集合。

这句话充分体现了 实体对象 和 值对象的关系

我们所关心的事是事实,他是 实体

而我们所关心的事实是由0到N个事物组成的集合

如果觉得抽象的话 请用DNA来理解

每个碱基(DNA由“jian”基组成,具体哪个"jian"忘了)就是值对象,而拼凑成的DNA为实体,而且这个实体是唯一的,我们把他当作每一个人。

有一个大前提,就是当你关心到人的时候,这个世界上每一个人就是实体,而组成这个世界上所有的人的“jian”基就是值对象了。

那 这么看来 每一个人(事实)都由“jian”基(事物)所组成了。

dongnan99
2010-01-28 21:46

我好好琢磨琢磨。Tks

chetieq
2010-01-29 14:27

其实看到这里时,我能理解这个意思。

但实际使用中,我们是怎么使用的?

能否举例呢?

我是这样理解的,不晓得正确否:

Person PA=new Person("A");//entity(PA)的名字叫A

使用过程中,我们想要用到A这个人时,我们就直接通过实体PA来调用。

当我们要到B这个人时,

我们不是通过PA.setName("B")来呼叫B。而是

Person PB=new Person("B"),或者PA=new Person("B")来实现。

如果只是表述这个意思的话,那我觉得大家过度关注这个就是没找到主要矛盾了。因为平时大家就是那样写代码的。很少会去setName("B")。

这样理解对么?