如何参数化 UML 序列图并将其应用于多个对象实例?
How to parameterize a UML sequence diagram and apply it to multiple object instances?
我想创建一个序列图来显示一些交互,然后将该序列图用作其他序列图上的交互事件(子序列)。关键是我想每次都将子序列应用于子序列中交互所涉及的不同对象实例。在我的例子中,实例只是各种文件工件。 UML 规定了这样做的任何合法方法吗?
编辑:进一步澄清我的背景:
- 我有 2 个主序列图,我想在其中重用子序列作为交互事件
- 第一个主序列有一个文件,子序列必须应用3次
- 第 2 个主序列有 3 个不同的文件,子序列必须应用 3 次
- 文件被同一个对象实例读取
- 我通过原型为
<<
read>>
的调用箭头从文件读取模型到代表文件的对象实例。
我需要在子序列中以某种方式引用该文件,但我还没有找到一种好的、简单的方法。
基本上可以通过三种不同的方式来指定此类情况。
- 使用门。使用门,您可以指定消息的序列,这些消息在定义的门处开始或结束,并且在大多数工具(如果完全可用)中没有明确显示。相反,它是用在交互边界开始或结束的消息建模的。
- 类似于失物招领处的消息。这些是将控制权传递给另一个序列或从一个序列传递 returns 的特殊消息。例如在您可以定义一组进一步的图表以更详细地指定交互之前的情况。
- 使用抽象,这是我在大多数情况下的最爱。这意味着您从 类 中提取公共接口并指定针对接口而不是具体 类.
的交互
复杂但正式(几乎)正确的协作解决方案
仅使用 InteractionUses 是不够的,因为这不允许您将主要交互中的实际角色分配给您使用的交互中的通用角色。
Collaborations、CollaborationUses 和 Role Bindings 可用于此目的。
在这里看我的例子:
这定义了一个具有通用角色发送者、中继者和接收者的协作,并显示了它们之间的交互。
您现在可以在具体情况下使用此协作:
Class S 使用 Collaboration 两次,其部分具有不同的角色绑定(假定 A、B 和 C 能够发送和接收 Sig1)。
使用这些定义,您现在可以创建主序列图:
不幸的是,这不是正确的 UML,即使规范中有一个示例(我提交了一个问题 https://issues.omg.org/browse/UMLR-768)。在工作组提出解决方案之前,您将不得不伪造此符号。如何伪造它,取决于您的工具执行规范的严格程度。
优点:形式上正确且通用的解决方案,以规范中的示例为后盾
缺点:复杂难解释,不完全可用,因为规范有bug
使用参数交互:
现在我们想在 InteractionUse 的参数中引用主交互的生命线。不幸的是,在 UML 中这是不可能的,因为参数是 ValueSpecifications 并且它们不能引用另一个模型元素。
然而,NoMagic suggested 并实现了一个额外的 ValueSpecification,称为 ElementValue,它正是这样做的。我认为这将是对 UML 的一个有价值的补充,并希望有一天它会被添加。到那时,只有 MagicDraw 用户可以使用此解决方案(据我所知)。
有了这个非标准元素,我们可以建模:
生命线之间的连接现在是通过通用交互参数的参数。从技术上讲,生命线不需要被交互使用明确覆盖,但我认为这样做是有意义的(在我的工具中显示,交互使用的边界上有一个非标准圆圈)。
优点:
紧凑且通用的解决方案,几乎符合标准
缺点:
使用非标准模型元素,目前仅供MagicDraw用户使用。
具有覆盖生命线的务实的不一致解决方案:
协作和参数解决方案允许(几乎)形式上正确地指定它。然而,在许多情况下,一个简化的模型就足够了。例如,在你的情况下,你只有两个参与者,他们有不同的类型。因此,即使所用交互的生命线与主要交互的生命线之间没有正式联系,也不会有歧义。您可以使用 InteractionUse 的覆盖属性来指定您针对特定 InteractionUse 的生命线(文件)。这可能是您正在寻找的实用解决方案吗?
优点:
紧凑型解决方案
缺点:
不符合UML,在更复杂的情况下会模棱两可
我想创建一个序列图来显示一些交互,然后将该序列图用作其他序列图上的交互事件(子序列)。关键是我想每次都将子序列应用于子序列中交互所涉及的不同对象实例。在我的例子中,实例只是各种文件工件。 UML 规定了这样做的任何合法方法吗?
编辑:进一步澄清我的背景:
- 我有 2 个主序列图,我想在其中重用子序列作为交互事件
- 第一个主序列有一个文件,子序列必须应用3次
- 第 2 个主序列有 3 个不同的文件,子序列必须应用 3 次
- 文件被同一个对象实例读取
- 我通过原型为
<<
read>>
的调用箭头从文件读取模型到代表文件的对象实例。
我需要在子序列中以某种方式引用该文件,但我还没有找到一种好的、简单的方法。
基本上可以通过三种不同的方式来指定此类情况。
- 使用门。使用门,您可以指定消息的序列,这些消息在定义的门处开始或结束,并且在大多数工具(如果完全可用)中没有明确显示。相反,它是用在交互边界开始或结束的消息建模的。
- 类似于失物招领处的消息。这些是将控制权传递给另一个序列或从一个序列传递 returns 的特殊消息。例如在您可以定义一组进一步的图表以更详细地指定交互之前的情况。
- 使用抽象,这是我在大多数情况下的最爱。这意味着您从 类 中提取公共接口并指定针对接口而不是具体 类. 的交互
复杂但正式(几乎)正确的协作解决方案
仅使用 InteractionUses 是不够的,因为这不允许您将主要交互中的实际角色分配给您使用的交互中的通用角色。
Collaborations、CollaborationUses 和 Role Bindings 可用于此目的。
在这里看我的例子:
您现在可以在具体情况下使用此协作:
使用这些定义,您现在可以创建主序列图:
优点:形式上正确且通用的解决方案,以规范中的示例为后盾
缺点:复杂难解释,不完全可用,因为规范有bug
使用参数交互:
现在我们想在 InteractionUse 的参数中引用主交互的生命线。不幸的是,在 UML 中这是不可能的,因为参数是 ValueSpecifications 并且它们不能引用另一个模型元素。
然而,NoMagic suggested 并实现了一个额外的 ValueSpecification,称为 ElementValue,它正是这样做的。我认为这将是对 UML 的一个有价值的补充,并希望有一天它会被添加。到那时,只有 MagicDraw 用户可以使用此解决方案(据我所知)。
有了这个非标准元素,我们可以建模:
生命线之间的连接现在是通过通用交互参数的参数。从技术上讲,生命线不需要被交互使用明确覆盖,但我认为这样做是有意义的(在我的工具中显示,交互使用的边界上有一个非标准圆圈)。
优点: 紧凑且通用的解决方案,几乎符合标准
缺点: 使用非标准模型元素,目前仅供MagicDraw用户使用。
具有覆盖生命线的务实的不一致解决方案:
协作和参数解决方案允许(几乎)形式上正确地指定它。然而,在许多情况下,一个简化的模型就足够了。例如,在你的情况下,你只有两个参与者,他们有不同的类型。因此,即使所用交互的生命线与主要交互的生命线之间没有正式联系,也不会有歧义。您可以使用 InteractionUse 的覆盖属性来指定您针对特定 InteractionUse 的生命线(文件)。这可能是您正在寻找的实用解决方案吗?
优点: 紧凑型解决方案
缺点: 不符合UML,在更复杂的情况下会模棱两可