UML Activity 图:如何 select 在两个对象之间扩展区域

UML Activity diagrams: how to select between two objects in an expansion region

我想表达的是,扩展区域内的操作应该在第一次迭代时从扩展区域外获取其第一个参数,并在连续迭代中从部分结果中获取。这是我要绘制的 activity 图:

我理解规范允许解释,在第一次扩展区域迭代中,“模板输入”应该首先从“已验证数据集”接收令牌,然后将该令牌传递给“应用模板并存储.. 。“ 别针。但是,在连续的迭代中,“模板输入”将从“部分结果”中接收一个标记。

这是一个有效的解释吗?

另一方面,我不是 100% 确定输出参数。我理解它应该 return 完成迭代后的最后部分结果。

任何其他改进 activity 图的建议将不胜感激。

跟进

我仔细采纳了 Axel Scheithauer 的建议并制作了第二张改进图。

具体来说:

现在解决问题:

除了更正后的图表之外,我还制作了一个简单的动画,展示了我如何理解令牌流经动作和“流”扩展区域。我知道输入集合可能多于或少于四个元素;为了说明,我喘了口气。我说的对吗?

不,不是这样的。输入集合中的每个项目都单独处理,因此每次执行它都会获得自己未更改的 Validated dataset.

副本

Section 16.12.3: tokens offered on ActivityEdges that cross into an ExpansionRegion from outside it are duplicated for each expansion execution

为了得到你想要的,你需要使用 «stream» 而不是 «iterative»。

If the value is stream, there is exactly one expansion execution

您甚至不需要中央缓冲区。 Apply Template 的第一次执行将消耗带有 Validated Dataset 的令牌。第二次和所有后续执行将从其自己的输出引脚接收 Partial result

允许扩展区域上的输出引脚,但 UML 中未定义任何语义

ExpansionRegions may also have OutputPins and ActivityEdges that cross out of the ExpansionRegion from inside it. However, the semantics are undefined for offering tokens to such OutputPins or ActivityEdges.

这有点奇怪。我认为定义提供给输出引脚的任何令牌都将存储在那里是有意义的,但只有在所有执行完成后才提供给传出边缘。这将对应于为扩展节点定义的行为:

When the ExpansionRegion completes all expansion executions, it offers the output collections on its output ExpansionNodes on any ActivityEdges outgoing from those nodes (they are not offered during the execution of the ExpansionRegion).

为了仅 return 最终结果,您可以在输出引脚上使用“覆盖”。这样,每个后续结果都会覆盖之前的结果。

图表有问题

我认为图中有一些与您的问题无关的问题需要更正。

  • 图表顶行的矩形可能是 Activity 参数节点。因此,它们应该与图的边界重叠。它们的类型也将显示在矩形内,并且它们需要连接到另一侧的输入引脚。
  • 您正在混合使用 pin(例如 Partial res validation)和对象表示法(例如 Partial result)。我建议坚持一种可能性。
  • 对象表示法仅在对象流连接两个引脚的情况下可用。例如,在将引脚连接到扩展节点的对象流上标记为 Templates 的矩形不正确。
  • 部分结果被多次使用。由于令牌只能被消耗一次,所以这是一个死锁。需要使用fork节点将其一分为四
  • 扩展区的输出引脚应该在它的外面。
  • 之字形箭头是异常处理程序。我猜你想让它们成为中断边缘,但它们只能在可中断区域内使用。您需要添加这些区域。然后您还需要一个决策节点来测试验证结果,如果失败则通过中断边离开可中断区域。
  • Error Report 的三个传入边意味着,它们都必须有一个令牌。您需要在操作之前添加一个合并节点。