UML:
聚合关系:成员对象是整体的一部分,但是成员对象可以脱离整体对象独立存在。
如汽车(Car)与引擎(Engine)、轮胎(Wheel)、车灯(Light)之间的关系为聚合关系,引擎、轮胎、车灯可以脱离车而存在,比如把一个引擎换到另一个汽车上也可以。

组合关系:也表示的是一种整体和部分的关系,但是在组合关系中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也不存在,整体对象和成员对象之间具有同生共死的关系。

所以,聚合和组合的差别就一点:整体和部分的生命周期是否一致,即整体消亡后,成员对象是否可以脱离整体对象而单独存在。

DDD聚合关系:
也是一种整体和部分的关系,部分脱离整体会变得毫无意义,强调同生共死的一致的生命周期。所以,从定义来看DDD中的聚合应该和UML中的组合关系是一致的。

按照上面的定义,我们在来分析一下一个典型的例子,就是公司和部门的关系。

UML的角度:
1、一个公司由多个部门组成,所以满足整体和部分的关系;
2、一个部门不能脱离公司和加入到其他公司;

所以,在UML中应该属于组合关系,没有问题。

DDD的角度:
虽然基于UML的角度,公司和部门属于组合关系,那在DDD中是否应该把部门聚合在公司下面呢?我的看法是,虽然从生命周期上,确实部门不能脱离公司。
但是DDD的聚合设计要考虑的因素会更加丰满,比如:

  • DDD强调需求和Bounded Context,也就是会基于需求和上下文进行建模,我们建模前必须要先确定当前的需求和上下文是什么;
  • 整体在当前上下文是否强关心部分的存在;
  • 整体和部分之间是否存在某些不变性规则;
  • 操作整体与操作部分的业务场景是否一致;
  • 性能问题,如果整体聚合的部分数量过大,那也不会考虑聚合,即小聚合原则;
  • 一致性问题,我们在设计系统时,即便把本该是聚合在一起的对象分开设计为多个聚合,也可以从技术上去解决一致性,比如通过领域服务来完成多个聚合的协同创建、删除、修改,并能通过数据库事务来保证严格的强一致性;
  • DDD领域建模会对领域概念进行抽象,所以再领域模型中,也许就没有公司了,而是只有部门,把公司也看成是一个顶层的部门就行,所以自然就不会有公司这个聚合根了;

所以,在进行DDD聚合设计时,如果仅从整体删除后部分会变得毫无意义(即对象之间的生命周期)这个点去推导的话,那考虑的就太单薄了,很有可能会得出不合理的聚合设计。
这是没有认真分析业务需求,没有分析业务规则不变性,没有对领域概念进行合理抽象,没有进行OO软件设计原则的应用的表现。

我想,这也是为什么DDD聚合设计为何会如此之难的原因了。

所以,结论是,以上案例由于需求不明,无法进行聚合设计,大家是不是很意外呢?居然没有给出答案:)

DDD中的聚合和UML中的聚合以及组合的关系的更多相关文章

  1. UML类图-聚合和组合的区别

    类图-组合和聚合 学习自 http://blog.sina.com.cn/s/blog_4ae8f77f0100ji5k.html http://blog.csdn.net/nodeathphoeni ...

  2. UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)

    UML类图关系(泛化 .继承.实现.依赖.关联.聚合.组合) 继承.实现.依赖.关联.聚合.组合的联系与区别 分别介绍这几种关系: 继承 指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父 ...

  3. UML[1] UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)(转)

    转自:http://blog.csdn.net/zhaoxu0312/article/details/7212152 继承.实现.依赖.关联.聚合.组合的联系与区别 分别介绍这几种关系: 继承 指的是 ...

  4. 8.2.1 UML, 组合和聚合、关联和依赖

    类A的属性是另一个类B,那么这两个类是关联的,但不一定是聚合,如果在A类中创建了B类的实例(使用new!),那么B类和A类就是聚合关系,但不一定是组合关系,因为不一定在A类创建的同时去创建B类的实例, ...

  5. 【UML】UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)

    http://www.cnblogs.com/olvo/archive/2012/05/03/2481014.html 继承.实现.依赖.关联.聚合.组合的联系与区别 分别介绍这几种关系: 继承 指的 ...

  6. UML类图关系(继承、泛化、实现、依赖、关联、聚合、组合)

    继承.实现.依赖.关联.聚合.组合的联系与区别 分别介绍这几种关系: 继承 指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者 ...

  7. UML类关系:依赖,关联,聚合和组合

    UML图示例:(可使用StartUML来画图,小巧^_^) http://www.blogjava.net/lukangping/archive/2010/08/01/327693.html 聚合:表 ...

  8. 详解UML中的6大关系(关联、依赖、聚合、组合、泛化、实现)

      UML中的6大关系相关英文及音标: 依赖关系 dependency --------> 关联关系 association ______> 聚合关系 aggregation ______ ...

  9. UML中的几种关系(UML Relationships)

    依赖(Dependency) 依赖可以理解为一个类A使用到了另一个类B,而这种使用关系是具有偶然性的.临时性的.非常弱的,但是B类的变化会影响到A:比如某人要过河,需要借用一条船,此时人与船之间的关系 ...

随机推荐

  1. 【NOI2016】优秀的拆分

    题目描述 如果一个字符串可以被拆分为 $AABB$ 的形式,其中 $A$ 和 $B$ 是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串 aabaabaa,如果令 $A = \m ...

  2. ARC 098 D - Xor Sum 2

    Problem Statement There is an integer sequence A of length N. Find the number of the pairs of intege ...

  3. IntelliJ IDEA 14.x 的 project 和 module 是啥关系?

    使用基于IntelliJ的IDE,如phpstorm.android studio都会对project和module的关系比较糊涂,简单的概括如下: IntelliJ系中的 Project 相当于Ec ...

  4. nginx,wsgi,django的关系

    http://blog.csdn.net/lihao21/article/details/52304119 wsgi用于连续 nginx和django,客户端发来的请求,先经过wsgi,然后再传给dj ...

  5. 如何评价 GitHub 发布的文本编辑器 Atom?

    这里是HN上的讨论:GitHub's new text editor leaked on Twitter这里是github page:Atom · GitHub 好多repo啊我不知道有没有知友了解更 ...

  6. 让用VS2012/VS2013编写的程序在XP中顺利执行

    微软为了推销自家平台,默认配置下VS2012和VS2013编写的应用程序仅仅能在Vista/Win7/Win8上执行.但幸好还保留了生成XP程序的设置项.XP和Win2003的用户还是大量存在的,我们 ...

  7. HDFS删除并清空回收站

    删除文件并放入回收站: hdfs dfs -rm -f /path 删除文件不放入回收站: hdfs dfs -rm -f -skipTrash /path 清空回收站: hdfs dfs -expu ...

  8. 计算机速度GHz等于每秒多少次

    这个是没有对比关系的.需要看处理器的微指令.计算机的GHz指的是CPU的时钟频率,不同的指令需要的时钟个数是不同的,列如,从内存读一个数据,一般需要4个时钟周期,而进行一次8位数的加法运算,一般需要1 ...

  9. 2017.7.10 Redis报错:DENIED Redis is running in protected mode

    参考来自: java 客户端链接不上redis解决方案 DENIED Redis is running in protected mode 完整错误信息: Caused by: redis.clien ...

  10. openlayers对接百度地图新方法

    上次给大家提供的openlayers对接百度地图有些问题,是因为没有进行分辨率设置,也没有进行相应的平面坐标转换,获取getURL的方法还是没有变化的 getURL: function (bounds ...