【问题标题】:UML activity diagram: fork with guard conditions on the outputsUML 活动图:在输出上带有保护条件的分叉
【发布时间】:2018-08-02 16:42:45
【问题描述】:

我在活动图中遇到了保护条件和分叉的语义问题。假设终止动作 A 导致一个分叉,分叉的输出导致动作 B 和 C(即这个分叉有 1 个输入和 2 个输出)。如果 A 已经成功终止,并且 B 的保护条件有效而 C 的保护条件无效,那么整个活动是否会继续操作 B 并等待 C 的保护条件变为真,或者 B 和 C 都不会执行?

更新:考虑以下活动示例

假设A第一次终止,C的保护条件无效,而B没有保护。沿着合并节点,第二次执行 A。 A第二次终止后,C的保护条件永久有效,由于A的第一次和第二次终止,会连续执行两次。这样正确吗?

【问题讨论】:

  • 前提条件是什么意思?如果您的意思是保护条件,那么它们应该在您的图表上可见。
  • 是的。我更新了帖子,现在应该更清楚地说明问题。

标签: uml activity-diagram


【解决方案1】:

一旦A 完成,它将出现一个令牌,并且分叉将复制它。一个令牌直接到达B,在完成后重新触发A 到无穷大。现在,前往C 的令牌会发生什么情况?他们只是在警卫前排队。当守卫在一段时间后打开时,它会传递一个令牌(因为C 只能保存一个令牌)。当C 完成时,它将允许另一个令牌进入(如果同时到达多个令牌),这取决于警卫。基本上C 可以启动的次数与之前完成的A 一样多。

注意您对“输出的保护条件”问题的暗示是错误的。守卫总是在动作的传入控制流上。叉子不会控制守卫,它是动作。而且,一个动作永远不能对输出有警戒。这被控制为动作的行为。当它终止时,它会在每个其传出控制流(所谓的隐式分叉)上出现一个令牌。

作为常见信息留下的初始问题的答案

其实你画的时候,情况就很明显了:

从顶部分叉中出现的令牌将被阻止。 B 将在令牌通过警卫后启动。因为C 没有启动,下叉将挂起,因为它需要 2 个令牌。所以没有达到D。除非来自C 的守卫在某些时候会被外部解锁。

【讨论】:

  • 感谢您的回答。我在帖子中更新了一些进一步的数据,你能检查我的理解是否正确吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多