【问题标题】:What are the differences between Object Collections, Object Aggregates, Object Associations, and Object Composition?对象集合、对象聚合、对象关联和对象组合之间有什么区别?
【发布时间】:2015-05-24 09:42:29
【问题描述】:

我看到这些术语被使用,我认为我自己对它们的使用可能不正确。我想知道它们到底有什么不同。

对象集合 - ???

对象聚合 - ???

对象关联 - ???

对象组合 - ???

在谈论 ORM、数据映射器和存储库时,这些术语似乎最近出现了。例如,福勒提到了object collections here。这些术语的具体含义是什么?我应该如何在口语中有效地使用它们?

【问题讨论】:

    标签: oop repository-pattern semantics aggregation poeaa


    【解决方案1】:

    对象集合

    是一个比“数组”更广泛的术语,但包括“数组”。集合本身就是对象,它的主要目标是存储其他几个对象,以及依赖于每个集合类型的其他特性,例如插入顺序或提取顺序,如果允许重复项,等等。

    对象关联

    也是,一个很笼统的名词,它暗示了2个对象之间存在概念上的关系。还有几种“协会”,具有更具体的目标。

    对象聚合

    是一种对象关联,其中一个对象与另一个对象相关。它们可以独立存在,一个对象的创建或销毁不会影响另一个对象,尽管某些操作是两个对象交互的结果。

    对象组合

    是一种对象关联,其中一个对象是另一个主要对象的一部分。子对象不能独立存在,通常是创建或销毁,由主对象管理。

    注意:

    注意:Object AggregationObject CompositionObject Association (s) 的一种,但不是唯一的。

    【讨论】:

    • 啊,“对象组合”是缺失的部分!现在一切都说得通了,谢谢。我还发现了这 2 个很好的例子:例子 1: A Company 是 People 的集合。公司是帐户的组合。当一家公司停止开展业务时,其帐户将不复存在,但其人员继续存在。 示例 2: 文本编辑器拥有一个缓冲区(组合)。文本编辑器使用文件(聚合)。当 Text Editor 关闭时,Buffer 被销毁,但 File 本身并没有被销毁。
    • 以上评论示例来自here
    • 另外,值得注意的是,如果您不关心 People 可以移动到仅在 Company(现在是组合)内部使用他们曾经单独存在。 (这意味着您的应用程序只允许从公司上下文中创建人员。我不认为 PHP 允许您实际上在类中定义类。)
    • @David Graham Object AggregationObject Composition 的概念是最常用但被误解的概念之一。
    【解决方案2】:

    添加到 umlcat 的答案,并附上一些例子:

    (as mentioned here in this great post)
    示例 1: 公司是人员的集合。公司是帐户的组合。当一家公司停止开展业务时,其账户将不复存在,但其人员继续存在。
    示例 2: 文本编辑器拥有一个缓冲区(组合)。文本编辑器使用文件(聚合)。当文本编辑器关闭时,缓冲区被销毁,但文件本身并没有被销毁。

    另外,我想说的是,如果您不关心人员是否独立于公司而存在,则可以将人员转移到严格在公司内部使用(现在 composition)。 (这意味着您的应用程序只允许从公司上下文中创建人员。我不认为 PHP 允许您在类中实际定义类。您最终只需要查看应用程序中的不同使用领域来确定如果您使用的是组合或聚合。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-19
      • 2010-10-22
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      相关资源
      最近更新 更多