2007-04-16

实体与值对象

实体:在时间上有连续性,并且有唯一标识可以来区分的对象。
值对象:用来描述事物的,不区分谁是谁的,不可变的对象。

判断一个对象是实体还是值对象,还要根据它在具体的业务领域中的实际意义来决定,比如:
体育馆里的座位,当业务领域这样规定,一张门票对应一个特定的座位,即每个座位都应该严格区分谁是谁,观众在选择座位时根据门票对应的座位号来选择这个唯一的座位,此时座位对象应该为实体。
但当业务领域改变规则,决定只要有门票,就可以进去随便坐,此时不需要明确哪个座位是哪个座位,只要有座位就可以坐下,每个座位都是同一个座位对象的副本(在某些场合可以通过共享一个对象来提高性能),无须区分谁是谁,此时座位对象应该为值对象。

评论
jlj008 2008-07-11
谢谢你的回复,对于你的这个例子里的学生来说,我们来做这样的假设:
有两个student对象studentA, studentB,
有一个字符串String strName="Jim","Jim"是一个String对象实例,而strName只是指向这个实例的引用,那么"值对象是不变的"这句话指的是什么意思呢?
其实就是"Jim"这个已经被创建的对象是不能变的,它不会变成"mike",只能另外新创建一个String对象,它的值叫"mike"。既然它不会被改变,所以它就理所当然能被共享。
那么我们修改studentA的name的属性的时候,其实是修改了引用,使它指向另一个值对象strNameB。
didiluck 2008-04-23
觉得你举的例子非常好。
现在我有几个问题:
1.值对象是不可变的。
在DDD书中提倡是构造器来创建值对象,它本身也只有get方法。
那么对于一个值对象来说,真的就没有需要更改其中的值的情况吗? 值对象应该也是服务于实体对象的吧。想java中比较典型的String,应该就是一个值对象。所以我觉得值对象不可变的意思是说这个对象的引用不变,还是它其中的数据不变呢?

2.值对象可以被共享
举个例子,有一个学生类:student{id(学号),name(姓名),age(年龄)},学生肯定是一个实体对象,其中的id作为唯一标识。其中的name和age应该就是值属性(值对象),因为它们是不能用来标识一个学生的。
那么这里的name和age作为一个值对象,如何做到“值对象是不变的”和“值对象可以被共享”呢?

希望您能和我讨论一下。
发表评论

您还没有登录,请登录后发表评论

jlj008
搜索本博客
最近加入圈子
存档
最新评论
  • 实体与值对象
    谢谢你的回复,对于你的这个例子里的学生来说,我们来做这样的假设:有两个stude ...
    -- by jlj008
  • 实体与值对象
    觉得你举的例子非常好。 现在我有几个问题: 1.值对象是不可变的。 在DDD书中 ...
    -- by didiluck