【问题标题】:UML: how to represent indirect operation calls in a sequence diagram?UML:如何在序列图中表示间接操作调用?
【发布时间】:2018-11-23 16:43:15
【问题描述】:

考虑以下类:

我想在序列图中表示这样一个事实,即 A 的实例首先导航通过 b 关联端到达 B 实例,然后通过其关联 c 导航到达 C 实例,然后调用操作foo()。

如何在序列图中表示这一点? Afaik,从一个对象导航到另一个对象不是消息,因此不能用箭头表示,对吗?那我怎么显示C实例是如何被A实例找到的呢?

到目前为止,我唯一的想法是将a.b.c 写入 C 实例生命线的名称中,但我知道这很可能是不正确的:


编辑 (28/11): 我不认为这个问题是 this existing question 的重复,因为在这里我有兴趣在序列图中表示一个对象如何能够访问另一个对象,而不是通过方法调用/消息获取对象的方式。


编辑(28/11 再次): 我意识到我所描述的情况是错误的,因为实际上是一个交互(即序列或通信图) 必须包含在 Classifier 中,并且只能显示可通过 Classifier 的属性访问的元素的 Lifelines。因此,对于我当前的类图,实际上不可能同时表示 A 的实例和 C 的实例,因为没有候选 Classifier 引用这两者可以用来包含序列图.

换句话说,afaik,用提议的类图,我不能有一个表示 A 和 C 的序列图,我只能表示 A 和 B,或 B 和 C。

【问题讨论】:

标签: uml class-diagram operation sequence-diagram


【解决方案1】:

在您的图中,您使用了属性的关联表示法:+b 表示 b 是 A 的公共属性,它属于 B 类,同样c 是公共属性的B。所以符号a.b.c:C 可能是有效的。

但是,我不能 100% 确定这是否真的是有效的 UML。该标准预见了元素名称,而不是确定元素的表达式。它允许限定名称,但在命名空间中而不是在分类器中。名称上可能的可选选择器也不是为遍历多个关系而设计的。

因此,更好的方法当然是为您的第二条生命线取一个简单的名称(例如 x,或保持匿名)并添加一个 constraint 来解释它是如何确定的(例如{ x = a.b.c }。在约束中,无论是 OCL、java 还是自然语言,您都可以对公共属性进行此类访问。

现在,从 OO 设计的角度来看,这可能是不可取的:使用此类公共成员会产生强耦合,并且不能提供适当的封装。因此,我会使用一些吸气剂。

结果将如下所示:

请注意,如果您不喜欢已知 b 的假设,您可以将说明性注释替换为实际约束,就像我上面解释的那样。

【讨论】:

  • 感谢您的回答,添加约束确实很有趣!由于 Interaction 本身(令人惊讶地)是一个 Class 并因此是一个 Namespace,因此它似乎可以包含约束。我想知道这是否是由语义计划的,但从语法上看,这似乎是可能的。
  • 那些不是约束,而是注释。
  • @ThomasKilian 抱歉,我没有放 {contraint} 大括号
【解决方案2】:

嗯,没有太多选择。如您所见,由于您违反了信息隐藏的范式,因此您无论如何都不应该做任何事情。

【讨论】:

  • 感谢您的回答!我的问题没有假设这里考虑了信息隐藏,因此我不认为这是一个问题。事实上,在某些情况下,例如早期的领域分析,一些方法提倡使用 UML 而不隐藏任何信息,这就是我最终提出这个问题的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-29
相关资源
最近更新 更多