Charts UML状态图中的转换:更好地使用触发器或保护?

Charts UML状态图中的转换:更好地使用触发器或保护?,charts,architecture,uml,state-machine,Charts,Architecture,Uml,State Machine,在UML状态图的设计中,我似乎可以选择使用触发器或保护逻辑来实现状态之间的转换 那么,使用哪一个更好呢?给定相同的转换逻辑,触发器的行为是否与保护不同?两者相比有哪些优点/缺点 根据特定的工具是否存在差异,或者UML标准是否严格定义了两种转换方法的行为 我目前正在使用Simulink Stateflow设计一个状态机。这两个概念不同 触发器是一个事件事件,它可以启用转换, 而保护是一种条件,必须将其评估为true才能继续转换 所以你不能互换使用它们——它们有不同的角色 还请注意,默认保护(如果未

在UML状态图的设计中,我似乎可以选择使用触发器保护逻辑来实现状态之间的转换

那么,使用哪一个更好呢?给定相同的转换逻辑,触发器的行为是否与保护不同?两者相比有哪些优点/缺点

根据特定的工具是否存在差异,或者UML标准是否严格定义了两种转换方法的行为


我目前正在使用Simulink Stateflow设计一个状态机。

这两个概念不同

触发器是一个事件事件,它可以启用转换, 而保护是一种条件,必须将其评估为true才能继续转换

所以你不能互换使用它们——它们有不同的角色

还请注意,默认保护(如果未指定)是
[true]
,因此触发器通常足以从一种状态移动到另一种状态

更新:

摘要:

  • 触发器(事件)是对象接收到的一些新数据(任何数据类型)
  • Guard是对象中始终存在的某些数据的布尔表达式

触发器(事件)是其他参与者触发的外部事件-用户按下按钮、浏览器请求页面加载等。因此,在上图中,用户每次按下数字锁上的数字时,都会触发“按下数字”事件

如果pin(数字序列)有效,则将启用到
unlocked
状态的转换

另一种看待它的方式:

如果按下键盘键,系统将触发
按键事件
,该事件将是一个触发器,其值为按下的键。然后,您可以创建一个guard
[pressedKey=enter]
(guard始终是一个布尔表达式)


然而,在这里,只有防护装置是不够的,因为没有什么可比的。

严格来说,没有触发器就不能使用防护装置

(第331页第14.2.4.8节)通过以下内容定义了状态机的转换:

[[',']*['['[']']['/']]
UML 2.0将其定义为:

<transition> ::= <trigger> [‘,’ <trigger>]* [‘[‘ <guard-constraint>’]’] [‘/’ <activity-expression>]
::=[',']*['['[']']['/']
触发器定义为:

<trigger> ::= <call-event> | <signal-event> | <any-receive-event> | <time-event> | <change-event>
::=| | | |
因此,在这两种情况下,不可能有一个没有任何触发器的保护的转换

根据UML 2.5.1,唯一的例外是内部转换,由以下内容指定:

{<trigger>}* ['[' <guard>']'] [/<behavior-expression>]
{}*['['']][/]

我只是看到了名称和术语,但最终的动作或结果似乎是一样的,使用保护或触发器都没有什么不同。如果我将表达式$x$放在保护中,并使用相同的数据、逻辑、事件或任何您想要给它的名称来驱动它为真或假,这将给出与使用相同数据、逻辑、事件或任何名称驱动触发器相同的结果。这种转变要么发生,要么不发生。现在还不清楚为什么一个和另一个会有所不同。你能提供一个更具体的例子来说明在结果或行动方面的差异吗?@docscience我更新了答案,现在可能更清楚了。触发器决定是否尝试转换,警卫将决定是否可以进行转换。如果没有触发转换的事件,则永远不会进行转换。只有当事件(触发器)指示可以进行转换时,才会评估转换的保护。我使用类似的状态图进行了一些研究,其中一个仅使用保护和输入数据来控制转换,而另一个仅使用触发器来控制转换。有了警卫,我总能在州与州之间实现可预测的过渡。通过触发器,我有时会得到转换。但触发因素是非常不可预测的。这就像图表并不总是能看到它们一样。一个区别是触发器需要指定上升沿、下降沿、两者或函数调用。我一直在使用上升沿。我想我还是不理解触发器。
{<trigger>}* ['[' <guard>']'] [/<behavior-expression>]