VO的一些个人认识

11-05-31 pye
刚开始的时候Entity和VO很容易混淆,分不太清楚,不过在实际使用之后有了一些个人的想法,先不管对错,贴出来探讨一下。

banq老师说VO是不能更改的,只能整体替换,这个我现在还没有理解。我自己从另一个角度的理解:

VO关乎于对象的粒度,VO来源于Entity,用VO来将Entity的一些职责分解出来,造成更加细粒度的对象来控制Entity不至于膨胀成为胖对象。

比如:contract对象就会分解出balance这个VO来,将金额控制的逻辑存放在balance中,contract对外封装调用而已。

    

6
banq
2011-05-31 10:24
实体和VO关系实际可以看成是主次之分,每次关注哪个Which或者Who等PPT时,只能关注一个,这句话怎么理解呢?就是一旦你进入战术纠结细节时,就只能选择一个,客观上你已经选择一个,比如你向南出发,其实你已经在东西南北四个中选择了南方向。

既然你已经选择了一个实体作为关注(包括其唯一标识),那么它就是主要关注对象,围绕这个实体其他高聚合属性就沦为附属次要地位值对象了。

结果变为楼主所说:可以控制实体粒度,造成更加细粒度的对象来控制Entity不至于膨胀成为胖对象。

pye
2011-05-31 13:22
也许我因为经验的欠缺,所以没有考虑的那么深,只是得到了一个可以控制细粒度的结果,看来还需要慢慢体会,再次感谢banq老师。

SpeedVan
2011-05-31 17:35
VO的不可改变性,决定了它的整体性,这是一种边界思维。或者更好的说法就是“实体状态”(PS),实体是连续状态的综合体,但我们只关注其离散的状态,所以就需要“状态迁移”。状态是整体的,刚好与值对象对应。

至于逻辑内聚,是边界体现,与不变性是无关的。(不会因为“不变”,所以就“内聚”吧)

不变性是因为离散关注。

showerxp
2011-06-02 12:03
“VO是不能更改的,只能整体替换”、“VO的不可改变性”……

这类结论,需当仔细研究

书本上的意思是:强烈建议值对象不可变。值对象不可变为的是共享。为什么值对象涉及到共享,实体不涉及共享概念?因为值对象没有自己独特身份“ID”,这样就可以节省系统开销——共享。既然共享,那么值对象就不能随意修改,因为要考虑引用这个共享值对象的其他对象的“感受”。

但是,值对象自打创建就不能修改吗?

啊,吃饭先。下回再说。

猜你喜欢
12Go 1 2 3 4 ... 12 下一页