值对象

值对象是什么??
为什么要值对象呢?

===============================来自JDON
Form由ForumState组成,ForumState是经常更新的,所以我们设计为一个状态值对象,如果不设计这个值对象,ForumState中的字段都放在Forum中,那么更新这些字段会导致Forum这个大对象锁住,从事务性能等方面都是不好的,从Evans DDD的OO设计角度也是不对的

================================================================================
DDD中也说:如果我们只关心模型中一个元素的属性,那么就可以把这个元素划为值对象,按照这个定义,最新帖子应该Forum和ForumThread等对象中很重要的一个元素,我为了表示其整体一致性,一旦有新帖,Forum或ForumThread的State就必须全部更换。这些都是吻合的。

=============================================================================

在我们的项目实际分析设计中,其实不用严格区分实体对象和值对象,用四色图来分析和理解更易接受。

值对象的作用应该主要集中在两方面:

1. 造成无负作用函数:因为值对象往往是动态生成的临时对象,其作用主要是提供一个规格或策略或特性而已, 所以对实体的类状态不产生影响。
但一定注意,代表计算,规格,策略或属性的值对象,作用是为实体对象修改其状态而生成的。 也就是说值对象只负责计算改变的值,而不真正实施改变。而真正的改变由实对象自己调用其他方法来进行。 这样使得计算和改变两个职责解耦,不联系在一起。 有几方面好处:

比如可以更改计算或规格策略,而不影响实体类; 不用跟踪计算的中间状态; 中间状态与修改状态无关。 所以我们可以放心使用值对象来计算。 因为它并不真正来影响实体类的状态,只是为状态改变提供值而已。可以提高程序性能,一般不用持久化值对象。

2. 在类之间关联关系造成存储级联关系时, 区分出值对象,可以考虑存储策略,因此可以提高程序性能(因为可能减少数据库的访问,减少缓存的压力):比如值对象可能不需要存储和保存(如规格类往往只是利用来进行验证或是计算的,一般不改,所以也就没有必要保存和更新),但也可能需要存储,是否存储由业务决定。
因此我的理解是:分析一个类是否作为值对象, 主要应该从以上方面考虑,而不应该以是否需要存储来作为和实体的本质区别。

同时由值对象是否需要存储而导致了值对象的不同创建策略,如果需要存储,说明这个值对象代表的规格是需要一再复用的,同时也是可以配置和修改的,创建采用读写文件形成,有需要的话可以结合反射技术。 如果不需要存储,说明是固化在代码中,对应的计算相对固定。

===========================================================================

引用
我认为state在初次创建时load一次属性即可,以后每当发帖就通知它,用新帖的属性去更新state里面的值,不必每次都重新查询。信任内存。

你可能感兴趣的:(OO)