3

分叉的节点最后一定要加入吗?传出的分叉节点可以有守卫吗?

基本上我想做的是将零钱退还给客户,同时继续洗车。

但是,也许有更好的方法来做到这一点?

UML 状态图

4

3 回答 3

1

分叉的节点最后一定要加入吗?

对我来说不,这不是强制性的,但是当所有流和链接元素也将结束时,该组将结束

传出的分叉节点可以有警卫吗?

您的意思是传出,规范说分叉段不能有 Guards 或 Trigger

基本上我想做的是将零钱退还给客户,同时继续洗车。

是的,它们可以并行完成,因为从洗衣机的角度来看,当它返回零钱并且洗涤也完成时,一切都完成了

于 2020-03-27T16:20:29.007 回答
1

分叉的节点最后一定要加入吗?

这取决于。如果您想继续拆分流程,那么可以。如果您不加入他们,那么您只有两个松散的结局独立地继续,直到他们每个人都以一种或其他方式终止。

传出的分叉节点可以有守卫吗?

P. 360 of UML 2.5 states

  • fork_segment_guards

分叉段不能有 Guards 或 Triggers。

inv: (source.oclIsKindOf(Pseudostate) and source.oclAsType(Pseudostate).kind = PseudostateKind::fork) implies (guard = null and trigger->isEmpty())

(我错了,在布鲁诺注意到我之后解决了这个问题。)

也许有更好的方法来做到这一点?

当然。描述事物的方式有很多种。但除了多余的守卫似乎还可以。

于 2020-03-27T16:50:22.467 回答
0

简而言之

它不是白底黑字,但如果你分叉,你会有一些限制,迟早会要求你加入实践。只有一个有效的构造可以让您在实践中避免加入。

更多细节

它是令牌并发流和结束流的规则的间接结果。

根据 UML 2.5 规范,flow-final 具有以下行为:

FlowFinalNode 是终止流的 FinalNode。FlowFinalNode 接受的所有令牌都被销毁。这对 Activity 中的其他流没有影响。

您可以使用它来吸收其中一个并发流上的令牌,而不会影响其他分支。

同样,activity-final 遵循以下原则:

ActivityFinalNode 是停止 Activity 中所有流的 FinalNode。到达 Activity 拥有的 ActivityFinalNode 的令牌会终止该 Activity 的执行。

但是没有规则来定义每个流的速度,如果没有连接,每个流也不会执行所有预期的活动。这就是缺少同步的问题。

想象一下,你有两个保持独立的分叉流:每个流都必须以某种方式结束。如果您没有加入:

如果一个 Activity 拥有多个 ActivityFinalNode,那么第一个接受令牌(如果有)的 Activity 将终止 Activity 的执行,包括任何其他 ActivityFinalNode 的执行。

因此,到达活动最终的第一个流将中断其他流上正在进行的活动,从而使其他流的性能不完整。

因此,确保两个分支都正确结束而不会中断的唯一方法是在每个分支上都有一个 flow-final。

如果其中一个流程周期存在令牌与并发流程相乘的问题,则会在电路中重新注入(对应于并发执行)。

避免连接节点的唯一其他方法是使用隐式连接:

在所有传入的 ControlFlow(如果有)都提供令牌之前,ExecutableNode 不应执行。也就是说, 传入的控制流上有一个隐式连接。特定种类的 ExecutableNodes 可能有额外的先决条件,在节点可以执行之前必须满足这些先决条件。

但无论是隐含的还是明确的,它都是一个连接;-)

于 2020-03-27T19:45:53.403 回答