uml:
聚合关系:成员对象是整体的一部分,但是成员对象可以脱离整体对象独立存在。
如汽车(car)与引擎(engine)、轮胎(wheel)、车灯(light)之间的关系为聚合关系,引擎、轮胎、车灯可以脱离车而存在,比如把一个引擎换到另一个汽车上也可以。
组合关系:也表示的是一种整体和部分的关系,但是在组合关系中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也不存在,整体对象和成员对象之间具有同生共死的关系。
所以,聚合和组合的差别就一点:整体和部分的生命周期是否一致,即整体消亡后,成员对象是否可以脱离整体对象而单独存在。
ddd聚合关系:
也是一种整体和部分的关系,部分脱离整体会变得毫无意义,强调同生共死的一致的生命周期。所以,从定义来看ddd中的聚合应该和uml中的组合关系是一致的。
按照上面的定义,我们在来分析一下一个典型的例子,就是公司和部门的关系。
uml的角度:
1、一个公司由多个部门组成,所以满足整体和部分的关系;
2、一个部门不能脱离公司和加入到其他公司;
所以,在uml中应该属于组合关系,没有问题。
ddd的角度:
虽然基于uml的角度,公司和部门属于组合关系,那在ddd中是否应该把部门聚合在公司下面呢?我的看法是,虽然从生命周期上,确实部门不能脱离公司。
但是ddd的聚合设计要考虑的因素会更加丰满,比如:
所以,在进行ddd聚合设计时,如果仅从整体删除后部分会变得毫无意义(即对象之间的生命周期)这个点去推导的话,那考虑的就太单薄了,很有可能会得出不合理的聚合设计。
这是没有认真分析业务需求,没有分析业务规则不变性,没有对领域概念进行合理抽象,没有进行oo软件设计原则的应用的表现。
我想,这也是为什么ddd聚合设计为何会如此之难的原因了。
所以,结论是,以上案例由于需求不明,无法进行聚合设计,大家是不是很意外呢?居然没有给出答案:)
如对本文有疑问, 点击进行留言回复!!
Asp.Net Core Identity 骚断腿的究极魔改实体类
你一定看得懂的 DDD+CQRS+EDA+ES 核心思想与极简可运行代码示例
网友评论