【问题标题】:Can Two Flows Go to Same Action in Activity Diagams?两个流可以在活动图中执行相同的操作吗?
【发布时间】:2018-02-10 18:48:37
【问题描述】:

我有两个流去同一个动作。行动是Make Payment。一个流用于rent,另一个流用于purchase。在这两种情况下,客户都必须付款。我想对两个流程都使用一个 payment 操作。或者我应该使用合并节点,然后将输出连接到make payment 操作。我不确定是否可以使用合并节点,因为这两个流程是相互独立的。我上传了一张图片。

【问题讨论】:

  • 这确实是一个棘手的问题,使我陷入困境。通常所有传入的弧都需要一个令牌来继续操作。目前正在再次阅读规格......

标签: uml activity-diagram


【解决方案1】:

这个让我走错了路。当有多个不受保护的转换离开一个状态/动作时,会发出一个隐式分叉,以便多个令牌独立离开并移动。第 401 页:

当 ExecutableNode 完成执行时,表示该执行的控制令牌从 ExecutableNode 中删除,并且在 ExecutableNode 的所有传出 ControlFlow 上提供控制令牌。也就是说,从 ExecutableNode 到其传出 ControlFlows 的控制流存在隐式分支。

我似乎记得类似地,两个传入的转换意味着两者都必须传递一个令牌。并阅读(上)第页。 401:

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

现在,当您查看 p。 425你找到了

合并节点是一个控制节点,它汇集了多个备用流。它不用于同步并发流,而是接受多个备用流中的一个。

所以你来了。您需要事先合并以使其正确。

N.B.:如果您是非正式地建模(因此在记录了这一点的某个领域),您可以使用您的符号,因为它经常被使用。理论和实践……不过不推荐。

【讨论】:

  • 我认为你不能像这样比较状态机和活动。主要区别在于活动是主动,而状态是被动。 AFAIK 规则,即每个传入的控制流在执行操作之前必须有一个令牌,不适用于状态和转换。
  • 虽然状态机图和活动图共享一些相似的图形元素和方法,但它们并不完全一致。在状态机图中,只要任何即将到来的转换完成,状态就会变为活动状态。因为通常有多种方法可以触发对状态的更改,这是唯一合乎逻辑的方法。它与活动不同,因此在该区域中,这两个图表完全不同。只关注与活动图相关的部分(第 401 页),您的答案是绝对正确的。
  • @Ister 谢谢你。我必须考虑一下,最终会删除我答案的下半部分。我还没有完全确定合并在这个“隐式连接”中有什么不同。我从来没有像我为状态机那样阅读 OP 图表时遇到问题。希望我明天有时间。
  • @Ister 你完全正确。我更新了我的答案。
  • @GeertBellekens 是的,你是对的。虽然这两种表示法都基于 Petri 网,但它们在 UML 中与不同的元素一起使用,因此不同。
【解决方案2】:

只是为了添加到 Thomas Kilian 的答案

你完全可以这样建模吗?是的。但这将意味着隐式加入,因此两个流程都必须完成才能启动付款操作。这是允许的,但不是您想要实现的。

你能在你的情况下这样建模吗?不会。这将与您想要实现的行为不同(加入而不是合并)。

是否可以在活动前使用 Merge 节点来获得预期的结果?是的,当我们想要在只有一个传入流完成时继续合并流时,这是绝对正确和首选的方式。流是单独触发的这一事实不会造成问题。

如果没有 Merge 节点,你能达到同样的效果吗?是的,您可以使用参数和参数集。您可以使用一个参数,然后到达该参数的流创建一个隐式合并。此外,如果您定义了参数集,则当仅向一个参数集的所有参数提供令牌时开始操作,但这意味着不同的参数集以不同的流程传递。然而,只有当您有一些参数要传递时,才可能使用带参数的方法。此外,它会更难理解,所以我不鼓励这种方法,直到你真正知道自己在做什么。

【讨论】:

    猜你喜欢
    • 2015-03-26
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多