1

简而言之

在 UML 通信图中,相互交互的对象在视觉上用线条连接,顺序消息可以沿着这些线条在两个方向上循环。对象之间的线通常表示链接,即关联的实例。但是对象可以交换消息,即使它们没有关联(例如,如果一个对象作为参数传递或返回给另一个对象)。

我希望表示没有关联的对象之间的这种消息交换。但我想消除歧义并澄清所涉及的对象之间没有直接关联。UML 规范是否允许在不创建用户定义的原型的情况下表达这一点?

此外,当前的 UML 规范是否在某处为通信图中交互的对象之间的关系定义了一个术语?是否可以在图中进一步指定通信对象如何相互了解?

在提出问题之前进行了更多研究

我目前正在重读 Grady Booch、James Rumbaugh 和 Ivar Jacobson 的“ UML 用户指南,第 2 版”,这是一本以易于阅读的明文解释 UML 规范的好书。这是本书的更新 UML 2 版本,我可以映射回他们的大部分声明的 UML 2.5.1 规范。

然而,在第 16 章关于交互的内容中,他们解释了对象通过链接进行通信:

链接指定一个对象可以将消息发送到另一个(或相同)对象的路径。(...) 如果您需要更准确地了解该路径的存在方式,您可以使用以下约束之一装饰链接的适当末端:

  • 关联:(...) 对象通过关联可见
  • self: (...) 对象是可见的,因为它是操作的调度程序
  • global: (...) 对象是可见的,因为它在封闭范围内
  • local: (...) 对象是可见的,因为它在本地范围内
  • 参数:(...)对象是可见的,因为它是一个参数

在第 19 章中,他们为通信图解释了交互中涉及的对象显示为相互关联的:

您将连接这些对象的链接渲染为该图的弧。链接可能有角色名来识别它们。最后,您使用对象发送和接收的消息来装饰这些链接。

这看起来很简单。于是我找了对应的UML 2.5.1规范:

  • 链接仅定义为关联的实例。
  • 对于通信图,17.9 节中根本没有提到链接和通信通道。图 17.26 显示了相互关联的对象(即生命线),但连接对象的线和表示沿这条线的消息的箭头似乎都以图形方式定义为“消息”。这对我来说似乎很模棱两可。
  • 此外,我还没有找到任何关于约束、关键字或预定义的原型的参考,这些参考可以描述对象在特定图表中如何相互了解,并且可以证明它们之间的通信渠道是合理的。
  • 我可以找到在过时的 UML 1.4 规范中定义为构造型的«association», «local», «global», «parameter»(具有与上述相同的含义),但在当前规范中不再存在。

因此我的问题。

4

1 回答 1

1

规范没有明确说明这一点,但我认为这是使用的链接的定义:

当两个对象可以相互交互时,它们被称为是链接的。

规范中有几个地方谈到了链接。我在11.2.3.3中找到的最通用的一个

每个链接可以通过像指针这样简单的东西或通过像网络连接这样复杂的东西来实现,并且可以表示实例能够通信的可能性,因为它们的身份通过作为参数传入并保存在变量中而已知或槽,甚至因为通信实例是同一个实例。

由此我得出了我的简单定义。

所以,我不同意,链接不是“仅仅定义为关联的实例”。这种误解可能源于这样一个事实,即使用 InstanceSpecifications 指定链接只能用于关联:每个想要为链接的 InstanceSpecifications 拥有插槽的 InstanceSpecification 必须有一个 Association 作为分类器。但是 - 即使未指定链接,也可以存在链接。它们可以由其他模型元素指定。

这些其他链接指定模型元素包括复合结构图中的连接器或交互图中的消息或类图中的属性参数

通信图只是显示交互的一种方式。它们具有与序列图相同的底层元模型实例。因此,即使生命线之间有线,也没有对应的模型元素。它们只是为了有一个附加消息符号的位置(参见表 17.4 通信图中包含的图形路径)。

消息可以引用连接器。因此,您可以将通信图中的线视为此连接器的可视化表示。但是,没有必要明确地对连接器建模。有些工具需要连接器,但在规范中,连接器是可选的。

正如您所说,没有刻板印象来描述对象如何相互了解。你需要定义你自己的。但是,还有其他可能性:生命线表示可连接的元素,它可以是参数或属性(或变量,但没有人使用它们)。通过查看表示的属性,可以知道是全局属性还是局部属性,是否是关联端。

话虽如此,有一个问题。官方表示的所有元素必须直接或间接属于交互的上下文类(17.12.17.5 中的same_classifier 约束)。在我遇到的大多数情况下,这个上下文只是系统。这意味着,所有属性都必须是全局的。我与本节的作者进行了长时间的交谈,发现这个想法是,交互应该属于协作,并且与系统的连接是通过 CollaborationUses 和 roleBindings。这就是为什么 MagicDraw 会自动为每个交互创建一个 Collaboration 的原因。

正如我们所知,这增加了另一层间接性,它解决了 ;-) 计算机科学中的所有问题。幸运的是,大多数工具都不会强制执行此规则,因此我们可以自由地让我们的生命线代表系统真实组件的属性和参数。

于 2021-11-09T17:21:43.290 回答