在模型的两个聚合中如何重用对象

14-02-13 aptx4869
在聚合1中,对象A是一个实体对象,在聚合2中,对象A是一个值对象,这种情况,在模型中该如何设计?是为聚合1,聚合2分别定义对象A,还是他们可以重用同一个对象A?

例如,在汽车这个聚合中,因为需要对每个轮胎进行跟踪,所以需要区分这些轮胎,因此,在汽车聚合中,轮胎是实体对象,在这个聚合中,它们需要有唯一的ID。而在轮胎回收站这个聚合中,轮胎只是一个物,并不需要进行区分识别,因此不需要有ID,所以,这些轮胎又变成了值对象。这两个聚合中的轮胎,只在有无标识这一点上有差别,那么在建模的时候,是需要分别定义两个轮胎对象,一个定义在汽车聚合中,另一个定义在轮胎回收站聚合中?还是只定义一个轮胎,在两个聚合中都聚合同一个轮胎?

banq
2014-02-13 19:06
重用设计分两个层次:

1. 为重用而重用,看到重复的就合并,直观的合并同类项;

2. 尊重聚合,聚合第一,重用第二,这样的重用是有上下文边界的,不至于眉毛胡子一把抓,范了跨上下文边界重用而导致依赖紧耦合。

为什么首先要尊重聚合呢?因为只有尊重聚合才有更自然的松耦合,如同我们加强水分子之间的凝聚力,通过冰冻方式就能将水划分成一个独立的有强内聚的冰块。

初步总结设计的先后主次:聚合第一 松耦合第二,最后是重用,而很多人都是反过来,更多设计可参考:http://www.jdon.com/designpatterns/the-single-responsibility-principle.html,其中提到的Cohesion也是这个意思。

按照我总结的这个原则,很显然虽然同一个对象存在两个聚合边界内,也是不能为重用而重用,因为它们在不同上下文中扮演的角色不同,一个扮演主要角色:实体;一个扮演次要角色:值对象。

[该贴被banq于2014-02-13 19:07修改过]

aptx4869
2014-02-14 09:17
谢谢banq的回复。按照Cohesion原则,确实是需要避免低聚合,应该设计两个对象,虽然有一些代码重复,但是让这也带来了很重要的好处,就是概念清晰,业务高内聚。再次谢谢banq的解惑

猜你喜欢