Uml 序列图中的Goto?

Uml 序列图中的Goto?,uml,sequence-diagram,Uml,Sequence Diagram,如何在序列图中显示goto语句 例如,在下图中,一旦“休眠到保持期”过期,我想将控制权带回“is_item_inventory_onhold_state(item_id)”语句。如何显示这是一个图表 我正在使用创建这些图表 为生成上述图表而编写的代码: title Item Executor loop for each item in a list Client->ItemExecutor: execute(item) ItemExecutor -> ItemStateSe

如何在序列图中显示goto语句

例如,在下图中,一旦“休眠到保持期”过期,我想将控制权带回“is_item_inventory_onhold_state(item_id)”语句。如何显示这是一个图表

我正在使用创建这些图表

为生成上述图表而编写的代码:

title Item Executor

loop  for each item in a list 
Client->ItemExecutor: execute(item)

ItemExecutor -> ItemStateService:is_item_inventory_onhold_state(item_id)

alt True - Item state is on hold
ItemStateService -->ItemExecutor: True
ItemExecutor ->ItemExecutor: sleep till hold period 

goto  ItemExecutor -> ItemStateService:is_item_inventory_onhold_state(item_id)

else False - Item is not in Held State
ItemStateService -->ItemExecutor:False
ItemExecutor ->ItemExecutor: do_something()

end

ItemExecutor ->Client : Acknowledge
end 

未显示转到本身。您只需显示发送了哪些操作。你可以在转到发生的地方加一张便条。然而,我认为不应该以任何方式鼓励使用gotos。相反,它可能需要一些异常处理

根据您的评论,您可以使用如下的
break
片段:

它将中断外部循环,因此
是\u项…
睡眠之后重复…


注意根据@AxelScheithauer的评论,
中断
将只留下封闭的片段。然而,我认为这是一个规范缺陷。中断“通常”用于循环控制流(加上一个案例控制流;但UML没有用于此的片段)。最好给
break
片段命名,这样很明显它会影响外部循环片段(如我编辑的图片所示)。

您不需要“goto”,就像我们很久没有在语言中使用它们一样


添加第二个循环并与组合片段“break”一起退出。

序列图中不支持Goto(出于充分的理由)。使用
循环
中断
运算符的组合。请参见此图:

关于这张图的几点注记

  • break片段
    离开立即封闭的片段。因此,它必须直接包含在
    循环片段中。如果它在alt片段中,则只剩下该片段
  • alt
    opt
    片段都不使用
    guard
    。发生的片段是通过出现带有特定
    返回值的
    reply
    消息来选择的。如果要使用保护,必须将返回值指定给局部变量。这将发生在alt片段之上(见下图)
  • 返回值用前面的冒号显示。消息名应该在前面,但是如果很明显,可以忽略它(这里就是这样)
  • 执行规范(有时称为“激活”)仅在有助于可读性的地方显示。与普遍的看法相反,它们不是强制性的
  • UML不知道每一个循环。因此,我添加了迭代器操作。术语“针对列表中的每个项目”不是一种保护条件。如果要避免拼写迭代器,可以使用附加到循环的-语义自由-
    注释。为此错误使用布尔值保护毫无意义。如果您想要一个正式的定义,您必须为每个循环添加您自己的原型
    «»
  • 我假设
    itempecutor
    ItemStateService
    是类名。它们需要在前面加一个冒号,以区别于角色名。当然,如果角色名和类名相同,那么您的关系图可能是正确的
  • “确认”消息只是
    执行
    消息的
    回复
    消息。因此,它将具有相同的名称(此处省略)
  • 在具有执行规范的版本中,绘图工具不允许
    执行规范
    的结尾与
    回复消息
    发送事件
    一致,这是正确的
带有
alt
break
片段保护的示例(摘录):

谢谢,您能帮我解决问题中提到的示例中的问题吗?实际上,除了缺少的对象活动部分(有活动时,生命线上方的正方形)之外,我看不出您的图表有任何问题。你应该解决这个问题。另外(最有可能)最后的确认可能是一个回复,而不是一条消息。谢谢你指出缺失的部分。我只是好奇,我怎样才能证明,一旦睡眠时间过去,我会再次检查“是项目、库存、持有状态”?note是这里最好的东西吗?它是否遵守一般惯例/规则?因此,在
睡眠之后…
您想继续上面的
s_item_…
吗?规范中提到了
break
操作符:“忽略封闭的交互片段的其余部分”。因此,它将保留
alt
片段。它不会影响循环。代码中的goto语句在哪里?非常感谢您的解释。你的意思是说显示一个具有显式中断条件和可选睡眠的无限循环?我在哪里可以找到这些准则?你有一些好的参考文章/书吗?不是(布尔)条件,而是一个中断片段,每当回复消息返回
false
返回值时就会出现。所有这些指导原则都直接来自规范,作为一个介绍,这并不是一个很好的读物。我现在没有最喜欢的英文书,这是不对的。
break
将始终执行,因此循环根本不会运行。而且大部分部分也缺少
ExecutionSpecification