Uml 序列图中的Goto?
如何在序列图中显示goto语句 例如,在下图中,一旦“休眠到保持期”过期,我想将控制权带回“is_item_inventory_onhold_state(item_id)”语句。如何显示这是一个图表 我正在使用创建这些图表 为生成上述图表而编写的代码: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
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
返回值的
消息来选择的。如果要使用保护,必须将返回值指定给局部变量。这将发生在alt片段之上(见下图)reply
- 返回值用前面的冒号显示。消息名应该在前面,但是如果很明显,可以忽略它(这里就是这样)
执行规范(有时称为“激活”)仅在有助于可读性的地方显示。与普遍的看法相反,它们不是强制性的
- UML不知道每一个循环。因此,我添加了迭代器操作。术语“针对列表中的每个项目”不是一种保护条件。如果要避免拼写迭代器,可以使用附加到循环的-语义自由-
注释。为此错误使用布尔值保护毫无意义。如果您想要一个正式的定义,您必须为每个循环添加您自己的原型
«»
- 我假设
和itempecutor
是类名。它们需要在前面加一个冒号,以区别于角色名。当然,如果角色名和类名相同,那么您的关系图可能是正确的ItemStateService
- “确认”消息只是
消息的执行
消息。因此,它将具有相同的名称(此处省略)回复
- 在具有执行规范的版本中,绘图工具不允许
的结尾与执行规范
的回复消息
一致,这是正确的发送事件
alt
和break
片段保护的示例(摘录):
谢谢,您能帮我解决问题中提到的示例中的问题吗?实际上,除了缺少的对象活动部分(有活动时,生命线上方的正方形)之外,我看不出您的图表有任何问题。你应该解决这个问题。另外(最有可能)最后的确认可能是一个回复,而不是一条消息。谢谢你指出缺失的部分。我只是好奇,我怎样才能证明,一旦睡眠时间过去,我会再次检查“是项目、库存、持有状态”?note是这里最好的东西吗?它是否遵守一般惯例/规则?因此,在
睡眠之后…
您想继续上面的s_item_…
吗?规范中提到了break
操作符:“忽略封闭的交互片段的其余部分”。因此,它将保留alt
片段。它不会影响循环。代码中的goto语句在哪里?非常感谢您的解释。你的意思是说显示一个具有显式中断条件和可选睡眠的无限循环?我在哪里可以找到这些准则?你有一些好的参考文章/书吗?不是(布尔)条件,而是一个中断片段,每当回复消息返回false
返回值时就会出现。所有这些指导原则都直接来自规范,作为一个介绍,这并不是一个很好的读物。我现在没有最喜欢的英文书,这是不对的。break
将始终执行,因此循环根本不会运行。而且大部分部分也缺少ExecutionSpecification
。