UML:如何在顺序图中表示间接操作调用?

时间:2018-11-23 16:43:15

标签: uml

请考虑以下课程:

enter image description here

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

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

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

enter image description here


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


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

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

2 个答案:

答案 0 :(得分:2)

在图中,您使用了属性的关联符号:+b表示bA的公共属性,属于B类,并且类似地,cB的公共属性。因此符号a.b.c:C可能是有效的。

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

因此,更好的方法肯定是给第二条生命线起一个简单的名字(例如x,或者保持匿名)并添加 constraint 来说明它是确定的(例如{ x = a.b.c }。在约束中,无论是OCL,Java还是自然语言,都可以对公共属性进行此类访问。

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

结果将如下所示:

enter image description here

请注意,如果您不喜欢b的已知假设,则可以按照我上面解释的方式,用实际约束替换说明性注释。

答案 1 :(得分:0)

嗯,没有太多选择。如您所见,您无所事事,因为您违反了信息隐藏的范式。