如何在UML序列图中绘制多个返回值

7

在UML序列图中,一个方法只能有一条返回线(至少在Astah中我无法从一个方法绘制两条返回线),如果-否则块中如何建模多个返回值?

在下面的示例中,返回线 'a' 结束了 methodX(),如何绘制返回线 'b'?

String methodX(int i) {
  if (i>0)
    return 'a';
  else
    return 'b';
}

     +------------+            +------------+
     |    Foo     |            |     Bar    |
     +-----+------+            +------+-----+
           |                          |
           |        methodX(i)         |
          +-+----------------------->+-+
          | |                        | |
  +-----+------------------------------------+
  | alt | | |  [i>0]                 | |     |
  +-----+ | |           a            | |     |
  |       | |<- - - - - - - - - - - -+-+     |
  |       | |                         |      |
  |       | |                         |      |
  +------------------------------------------+
  |       | |  [else]                 |      |
  |       | |                         |      |
  |       | |           b             |      |
  |       | |<- - - - - - - - - - - - | ??   |
  |       | |                         |      |
  |       | |                         |      |
  +------------------------------------------+
          | |                         |
          +-+                         |
           +                          +
2个回答

2
问题出在你的工具上,而不是UML本身。请查看visual paradigm for UML。你可以在每个alt片段的开头手动添加激活,并在激活结束时发送返回消息。请注意保留HTML标签。

1

快速观察:

(1) 请记住,一个类/对象可以向自己发送消息(“DoSomething”),这使得“替代方案”更难以理解。

(2) 当使用“alt”时,您必须提到条件。 “alt”表示编程语言中的“if-then-else”,“switch-case”等概念。

而这些句子有条件,必须添加到UML图中(“[condition]”)。

(3) 在“alt”的每个条件或情况中,可能会有几个对象之间的多个消息,或者是向自己发送的消息,或者没有任何消息(仅“返回”箭头)。

..........................................................
.......+---------+..............+---------+...............
.......|   Foo   |..............|   Bar   |...............
.......+----+----+..............+----+----+...............
............|........................|....................
..........+-+-+....................+-+-+..................
..........|   |......methodX().....|   |..................
..........|   +------------------->+   |..................
..........|   |....................|   |..DoSomething()...
..........|   |....................|   +---+..............
..........|   |....................|   |...|..............
..........|   |....................|   |...|..............
..........|   |....................|   |...|..............
..........|   |....................|   |<--+..............
..........|   |....................|   |..................
..+-----+-------------------------------------+...........
..|.alt.|.|   |....................|   |......|...........
..+-----+-------------------------------------+...........
..|.[option=1].....................|   |......|...........
..|.......|   |....................|   |......|...........
..|.......|   |....................|   +---+..|...........
..|.......|   |....................|   |...|..|...........
..|.......|   |....................|   |...|..|...........
..|.......|   |....................|   |...|..|...........
..|.......|   |....................|   |<--+..|...........
..|.......|   |<-------------------+   |......|...........
..|.......|   |....................|   |......|...........
..+-----+-------------------------------------+...........
..|.[option=2].....................|   |......|...........
..|.......|   |....................|   |......|...........
..|.......|   |....................|   |......|..// The wide bar its kept,
..|.......|   |<-------------------+   |......|..// even if there is a
..|.......|   |....................|   |......|..// previous return arrow
..+-------------------------------------------+...........
..|.[else]|...|....................|   |......|...........
..|.......|   |....................|   |......|...........
..|.......|   |....................|   |......|...........
..|.......|   |<-------------------+   |......|...........
..|.......|   |....................|   |......|...........
..+-------------------------------------------+...........
..........|   |....................|   |..................
..........+-+-+....................+-+-+..................
............|........................|....................
............|........................|....................
............X........................X....................
..........................................................

干杯。

P.D. 有没有芝士汉堡或金枪鱼汉堡给猫?


你的回答没有解决我的问题,即如何从一个方法中绘制多条返回线。doSomething() 的返回线只允许指向调用它的类/对象,例如在本例中是Bar,而不是Foo。请尝试在 UML 工具(如 Astah)中实现此功能。 - aleung
@aleung:请检查更新。即使在“返回箭头”之前,类宽栏也会保留。如果“守卫”不成立,则被省略并忽略,就像它不存在一样,并检查下一个“alt”,以此类推。您的图表在第一个“守卫”处截断了宽栏。 - umlcat
我猜这是Astah的限制,它在第一个回车处结束了该栏。Astah是我最喜欢的UML编辑器。我没有尝试过Visual Paradigm for UML,因为它需要注册。 - aleung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接