对值对象的理解
DDD中实体对象与值对象的解释比较抽象。 主要根据持续性与ID识别来区分。
但ID并非某一元素的直观自然属性, 而是经过分析建模之后确定了实体类,然后赋给实体类来达到跟踪,区别,存储目的的一个特值。 而在分析之前,如何判断一个概念是否有ID,这才是难点。
结合项目实践及DDD一书中的理论,感觉应该从以下几方面分析:
1. 某一概念是主动还是从属性的。如果是从属性的,且这种从属性的生命周期严格依赖于某实体,如可以考虑成为值对象的候选。
2. 某一概念是否可以被复用,共享,复制。象对应领域属性,规格,策略,规则的类,虽然对其他实体类的依赖性不是很强,可以独立存在。可以被不同的实体对象(不是指类)共享,复制,复用。如人的地址属性, 画笔的颜色字体属性,语言级别如string字符串。
3. 值对象创建后的作用:
3.1 往往是做为临时对象来进行计算,得出同类型的新值对象。来给实体对象业务使用。如创建查询标准这一临时对象,将此查询标准与其他查询标准组合,生成新查询标准, 给业务应用来进行过滤或查询。
3.2 创建做为临时对象来作为实体的业务行为的一个参数,以给业务行为提供验证检验审核某一规则或是特征之用
3.3 值对象提供的一些组合方法一般满足闭包特征:即 vo.add(VO anotherVO),vo.minus(VO anotherVO)都反回另一值对象。
4. 值对象的存储和与其相关联的实体类存储,由实体类来负责实体类的存储。通过设置实体对类与值类的级联关系。来达到实体类负责值对象的存储管理。
对于banq举例jj3中的 forumState为值对象,我存在疑问,因为forumState应该需要保存吧?比如某一时期的最高发贴数(这只属推测,JJ3源码的阅读正在日程表上,但现在还不了解)。
[该贴被boycott于2008-06-20 16:22修改过]