对象集合、对象聚合、对象关联和对象组合之间有什么区别?

What are the differences between Object Collections, Object Aggregates, Object Associations, and Object Composition?

我看到有人使用了这些术语,我想我自己对它们的使用可能不正确。我想知道它们究竟有何不同。

对象集合 - ???

对象聚合 - ???

对象关联 - ???

对象组合 - ???

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

对象集合

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

对象关联

也是,一个很笼统的词,它暗示着2个对象之间存在概念上的关系。还有几种 "associations",具有更具体的目标。

对象聚合

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

对象组合

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

注:

注:Object AggregationObject CompositionObject Association的一种,但不是唯一的

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

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

此外,我想说值得注意的是,如果您不关心人员是否存在独立性,则可以将其转移到公司内部严格使用(现在 组合)一家公司的。 (这意味着您的应用程序只允许在 Company 上下文中创建人员。我认为 PHP 不会让您在 类 中实际定义 类。您最终只会有查看应用程序中不同的使用领域,以确定您使用的是组合还是聚合。)