作文不是“作文”
Posted
技术标签:
【中文标题】作文不是“作文”【英文标题】:Composition is not "Composition" 【发布时间】:2017-12-29 12:02:31 【问题描述】:组合:一个类可以引用其他类的对象作为成员。这称为组合,有时也称为具有关系。
Deitel P.J., Deitel H.M. - Java 如何编程第 9 版。
这个观点在这个话题中讨论: Prefer composition over inheritance?
组合:组合聚合(composition)是一种“强”的聚合形式,具有以下特点:
*是二元关联,
*是整体/部分关系,
*一次最多可以将一个部分包含在一个复合(整体)中,并且
*如果一个组合(整体)被删除,它的所有组合部分都“正常”地被删除。
发现于http://www.uml-diagrams.org/composition.html (实际上,Deitel 在同一本书中提供了遵循这个想法的 UML 示例,但没有费心解释差异。
这个观点在这个话题中讨论:
What is the difference between association, aggregation and composition?
很好,两者都是正确的。这就引入了谐音概念的问题。
例如:不要用组合箭头绘制UML模型来举例说明第一个定义:在UML中,任何关联都是由Deitels'第一个定义的组合。
以下是我的问题的一些方面,可能有助于正确回答:
我怎么能说(并知道)我们在谈论哪个作品?
我们在哪里划定两个定义之间的界限(根据上下文)?
我可以说第一个是面向对象的编程,第二个是软件工程/建模吗?
UML 组合是仅限模型的概念/行话吗?
UML 组合是 UML 独有的东西吗?或者也应用在编程领域?
如何避免团队中“我们在谈论什么组成”的误解?
请用参考资料、证据来回答,这不是哲学/观点问题,而是我试图解决的“范围”问题。
这不是“什么是作曲”的问题。
编辑:我在想,如果区别是动词 x 形容词:“组成”一个类(第一个定义)和“一个复合关系”(第二个定义)。
【问题讨论】:
What is the difference between association, aggregation and composition?的可能重复 还有***.com/questions/21967841/… 【参考方案1】:引用第 110 页的 UML 2.5 规范:
有时,Property 用于对使用一个实例将一组实例组合在一起的情况进行建模;这称为聚合。为了表示这种情况,Property 具有 AggregationKind 类型的聚合属性;代表整个组的实例由 Property 的所有者分类,代表分组的个人的实例由 Property 的类型分类。 AggregationKind 是具有以下文字值的枚举:
none:表示 Property 没有聚合语义。
shared:表示 Property 具有共享聚合语义。共享聚合的精确语义因应用领域和建模者而异。
composite:表示Property是复合聚合的,即复合对象负责组合对象的存在和存储(见11.2.3部分的定义)。 p>
我个人认为复合聚合的概念是关于对象生命周期,而不是关于静态关系。 复合聚合会在其父节点死亡时杀死聚合成员。 无 将其保持打开状态。 共享聚合是 OMG 根本不应该引入的混蛋,因为它的语义是依赖于域的。
【讨论】:
Deitels 的组合是指任何非基本数据类型的私有变量。这就是我要在这里指出的冲突。范围/上下文是什么? 我可以问“谁是 Deitel?”。以上是来源:OMG 的 UML 规范。 Deitel P.J., Deitel H.M. - Java 如何编程第 9 版。它是一本书。这是问题。 嗯,更多的是“那个人到底是谁”?所以你引用的是他的观点,他从上面的来源解释了什么。 我不明白你的意思。在 *** 上,有一大批人采用了这种观点。事实上,它似乎比 OMG 的定义更广泛。无论如何,你的答案不是我要问的。【参考方案2】:我发现很难解释 UML 关联和实现引用之间的区别,而不至少解释一下 UML 关联实际上是什么以及它们可以做什么,所以我们开始吧。
关联和链接
让我们先来看看 UML 关联和链接(关联的实例)是什么。
[11.5.3.1] 关联指定类型化实例之间可能出现的语义关系。
[11.8.1.1] 链接是引用类型化对象的值元组。一个关联对一组链接进行分类,每个链接都是该关联的一个实例。链接中的每个值都引用了关联对应端的类型的一个实例。
所以以下是有限关联的有效实现。
class Brain
class Head
a = new Brain;
b = new Head;
link = (new Array).add(a).add(b);
所有权
[9.5.3] 当一个属性被一个分类器而不是一个关联通过ownedAttribute拥有时,那么它代表了分类器的一个属性。
(注意:类是分类器的子类。)
可导航性
[11.5.3.1] 一个关联的终端属性,由一个终端类拥有,或者是关联的 navigableOwnedEnd,表示关联可以从相对端导航;否则,该协会不能从相反的两端导航。可导航性意味着在运行时参与链接的实例(关联的实例)可以从关联另一端的实例有效地访问。实现这种有效访问的精确机制是特定于实现的。如果一端不可导航,则从其他端访问可能是可能的,也可能是不可能的,如果是,它可能效率不高。
为什么这些概念是相关的?想象一下下面的例子。
我们看到brain
是Head
类的一个属性(黑点表示对面类的所有权),并且它是可导航的(箭头)。
我们还看到head
不是Brain
的属性(没有黑点⇒ 不属于 Brain 类⇒ 不是 Brain 的属性),但是它仍然是可导航的。这意味着在 UML 中,head
属性由关联本身持有。
例如,实现可能如下所示(关联本身由两个引用的元组表示(参见前面的 link 描述)。
class Head
public Brain brain;
class Brain
h = new Head;
b = new Brain;
h.brain = b;
link = (new Array).add(h).add(b);
因此,正如您希望开始看到的那样,UML 关联并不是一个简单的概念,如 has-a 关系。
作曲
让我们添加另一个片段,作曲。
[11.5.3.1] 二进制关联可以表示复合聚合(即整体/部分关系)。组合由 isComposite 属性表示 [9.9.17] 只有聚合是复合的,isComposite 的值才为真。
聚合是
none - 表示该属性没有聚合语义。 shared - 表示该属性具有共享聚合语义。共享聚合的精确语义因应用领域和建模者而异。 composite -- 表示Property是复合聚合的,即复合对象对复合对象的存在和存储负责
我们再次看到,UML 关联明确指定了难以从实现中感知的概念(例如,谁负责对象管理/销毁)。
模型组合与对象实现组合
所以根据上面的描述,我们可以更准确地描述实现组合(has-a relationship)是什么。
[详细] 组合:一个类可以引用其他类的对象作为成员。这称为组合,有时也称为具有关系。 McConnell [Code Complete 2, 6.3] 也将 has-a 关系称为 Containment。
然而,他们都没有谈论 如何 对象(容器包含,composer-composite)相互关联,谁负责生命周期,或者包含的元素是否知道容器。
所以只要说对象有一个 has-a 关系(并称之为组合),你实际上可以指这些中的任何一个(以及更多)
因此,如果您在编程中调用组合,您几乎可以表示任何关系/引用(或者更确切地说不是继承),所以这个词本身并不是很有用。
另一方面,在 UML 中,您试图捕获有关对象如何相互关联的所有此类信息。因此,重点是赋予术语更精确的含义。因此,当您在 UML 中调用组合时,您会想到一个非常具体的 has-a 关系,其中容器负责所包含项目的生命周期。
UML 关联的实现
所有这些额外的概念信息意味着实际上没有精确的方法来实现关联。这是有道理的,因为实现将取决于目标编程语言或环境(例如可执行模型,其中 UML 概念用作最终产品)。
作为示例,我可以推荐一篇描述 Java 中 UML 关联实现的论文,其中包含多重性、可导航性和可见性等强制概念Implementing UML Associations in Java。
更多子问题
我怎么能说(并知道)我们在谈论哪个作品?
根据上下文,或者您可以直接询问(如果不确定,这总是一件好事)。就我个人而言,仅在与继承区分开来时,我才听说将组合用作“有关系”;其余的就 UML 而言。但话说回来,我在学术界,所以我的观点是有偏见的。
我们在哪里划定两个定义之间的界限(根据上下文)?
由于“编程”术语组合实际上没有任何意义(只是它是 has-a),我建议自己划清界限并推动其他人使用更精确的术语。
我可以说第一个是面向对象的编程,第二个是软件工程/建模吗?
或多或少,包含此答案中提到的所有细微差别。
UML 组合是仅模型概念/行话吗? UML 组合是 UML 独有的东西吗?或者也应用在编程领域?
不,您可以在编程中使用它来表示与 UML 中相同的含义,但您可能需要更清楚地说明它。例如。 “这个类是这些类的组合,因为它管理它们的生命周期。”。 重点是教人们区分常规的旧的 has-a 关系和具有更精确语义的关系。
如何避免团队中“我们在谈论什么组成”的误解?
这是一个非常广泛的问题,您可以将其应用于任何您想要附加特殊含义的术语(甚至是什么是软件工程?),并且没有最好的方法。拥有一个团队共享的词汇表(您的领域中可能已经有很多特定的术语),并指导人们使用更精确的术语。
带编号的引号是指UML 2.5 Specifications 中的部分。
【讨论】:
+1 表示有意义并指出“基本类型”的组合在 100% OO 语言上是可能的。我认为你在正确的轨道上,但我想要一些参考来解决这个问题。只是为了确定 UML 的组合是一种聚合,而不是相反。我建议将示例从汽车零件更改为人体器官,以避免与零件重复使用和品牌混淆。你不能共用一条腿。 @atorres 我已经改写了整个答案,以更好地解释 UML 中的概念。希望这能让差异更加明显。以上是关于作文不是“作文”的主要内容,如果未能解决你的问题,请参考以下文章