【问题标题】:How to draw multiple returns in UML sequence diagram如何在UML序列图中绘制多个返回
【发布时间】:2012-06-12 13:57:29
【问题描述】:

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

在下面的例子中,返回线'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             |      |
  |       | |<- - - - - - - - - - - - | ??   |
  |       | |                         |      |
  |       | |                         |      |
  +------------------------------------------+
          | |                         |
          +-+                         |
           +                          +

【问题讨论】:

    标签: uml sequence-diagram


    【解决方案1】:

    问题在于您的工具,而不是 UML。查看visual paradigm for UML。您可以在每个 alt 片段的开头手动添加激活,并在激活结束时发送返回消息。

    【讨论】:

      【解决方案2】:

      快速观察:

      (1) 请记住,类/对象可能会向自身发送消息(“DoSomething”), 这使得“替代品”更难以理解。

      (2) 使用“alt”时,必须提及条件。 “alt”,代表“if-then-else”、“switch-case”以及编程语言中的类似概念。

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

      (3) 在“alt”的每个条件或情况下,可能在多个对象之间有多个消息,或者对它们自己,或者没有(只有“return”箭头)。

      ..........................................................
      .......+---------+..............+---------+...............
      .......|   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 工具中尝试,例如阿斯塔。
      • @aleung:请检查更新。即使之前有“返回箭头”,也会保留类宽栏。如果“守卫”不为真,则将其省略并忽略,因为它不存在,并检查下一个“alt”,依此类推。您的图表在第一个“守卫”处削减了宽条。
      • 我猜这是Astah的限制,它在第一次返回时结束了酒吧。 Astah 是我最喜欢的 UML 编辑器。我没有尝试 UML 的 Visual 范例,因为它需要注册。
      猜你喜欢
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多