'do' 在 UML 状态图中做什么?

What does 'do' do in an UML Statechart diagram?

我不是 100% 确定 'do' 在 UML 状态图中做了什么。

我的想法是否正确:

如果发生转换,将先执行'entry',然后执行'do'。 如果我们离开状态,只有 'exit' 会被执行。

这个逻辑是否也适用于自反转换?

如果发生触发但不会触发转换怎么办?这只执行'do'吗?

The UML Specification 告诉我们:

14.2.3.4.3 State entry, exit, and doActivity Behaviors

. . .

A State may also have an associated doActivity Behavior. This Behavior commences execution when the State is entered (but only after the State entry Behavior has completed) and executes concurrently with any other Behaviors that may be associated with the State, until:

  • it completes (in which case a completion event is generated) or
  • the State is exited, in which case execution of the doActivity Behavior is aborted.

The execution of a doActivity Behavior of a State is not affected by the firing of an internal transition of that State.

你:

Does this logic apply to reflexive transitions as well?

正如上面最后一句话所说,这取决于自反转换是内部的还是外部的。

为布鲁诺的回答添加更具体的内容。

如 UML 规范中所述(布鲁诺在他的回答中引用),do activity 是在系统处于特定状态时执行的(在 条目 活动已完成)。它在系统处于状态的整个时间内执行。 do 活动仅在两种情况下停止执行:

  • 将您带出状态的转换已触发;在这种情况下,do 活动被中断,exit 活动(如果有)被执行,然后转换发生。转换可以是自反的(即一旦完成系统 returns 到相同的状态),在这种情况下将执行第一个 entry 活动,一旦它们完成,活动又要开始了
  • do 活动自行完成;在这种情况下,一旦 do 活动完成,就该离开状态了。因此,最终的 exit 活动执行并执行转换。一个有效的系统应该有一个或多个没有触发事件的转换(如果超过一个,那么它们应该有条件允许唯一地确定将使用哪个)一旦 exit活动(或 do 如果没有 exit)完成。

让我们举一个更具体的例子。考虑一台洗衣机。里面有两种有趣的状态,一种是装满水,一种是滚鼓。

对于注水状态,可以期待以下活动:

  • 进入:打开水阀
  • do: 监控水位
  • 退出: 关闭水阀

现在,一旦洗衣机进入状态,阀门正在打开(进入),紧接着洗衣机开始do:监测水位(因为水现在自由流动)。一旦达到当前程序和步骤的设定水位,发送“达到水位”事件,启动下一个转换。结果 do activity 被停止(不再监测水位)并执行 exit (阀门正在关闭),然后过渡到下一个状态(例如加热或滚筒滚动,具体取决于程序阶段)。

你可以清楚地看到,在这种情况下,do activity 一旦捕获到转换触发器就会被中断。

但对于鼓声来说,情况就大不相同了。为了简单起见,我们将只有一个 *do( activity,没有 entryexit 活动:

  • do: 以n速度旋转滚筒n秒

当洗衣机进入此状态时,它会立即开始滚动滚筒(除非被某些异常事件打断)并在预定义的时间内继续滚动。一旦该时间过去,do activity 立即中断并转换到下一个状态。在这种情况下,它是 do activity 控制何时发生下一个状态转换,至少在典型情况下是这样。