UML活动图: 如何在扩展区域中选择两个对象

3

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

UML activity diagram

我理解规范允许在第一次扩展区域迭代中,“模板输入”应该从“已验证数据集”接收一个标记,然后将该标记传递给“应用模板并存储…”引脚。然而,在后续的迭代中,“模板输入”将从“部分结果”接收一个标记。
这是一个有效的解释吗?
另一方面,我不确定输出参数是否正确。我理解它应该在完成迭代后返回最后一个部分结果。
任何其他改进活动图的建议都将不胜感激。
跟进:
我仔细考虑了Axel Scheithauer的建议,并制作了第二个改进的图表。
具体来说:
- 将“流”更改为“迭代”。关于“第二个及所有后续执行将从其输出引脚接收部分结果”,我希望我已经理解正确。两个边缘在同一个输入引脚上不感觉正确,但如果我理解正确,其中只有一个会在任何给定时刻拥有标记。 - 在输出引脚上使用“覆盖”。
现在是问题:
  • 现在,顶部有适当的活动参数节点。
  • 我不再混淆引脚和对象符号(我保留了引脚符号)。
  • 用双引脚符号替换了对象符号。
  • Partial result上添加了一个分支。
  • 扩展区域之外的输出引脚。
  • 关于中断边缘:我打算在使用XSLT处理器的任何操作失败时停止处理。添加了可中断区域和接受事件。我希望这是正确的。从我的流程角度来看,描绘错误发生的方式并不重要,而是如何处理它。
  • Error report中添加了合并节点。

除了修正的图表外,我制作了一个简单的动画,展示了我如何理解令牌通过操作和“流”扩展区域的流动。我知道输入集合可能有四个或更少元素,我为了说明而画了它们。我是对的吗?

enter image description here


我对 ADs 不是非常熟悉,但如果我没记错的话,部分结果只会提供一个单独的标记,而且不确定该标记会放在哪里(这是任意的)。然而,我记得还有一些关于隐式分叉的内容。你很快就会得到一些有用的答案。 - qwerty_so
1个回答

2
不,它不是这样工作的。输入集合中的每个项目都会被单独处理,因此每次执行都会得到自己的未更改的验证数据集副本。

第16.12.3节:跨越扩展区域进入其中的ActivityEdges上提供的令牌将为每个扩展执行复制

为了获得您想要的结果,需要使用“流”而不是“迭代”。

如果值为stream,则恰好有一个扩展执行

您甚至不需要中央缓冲区。 应用模板的第一次执行将使用带有验证数据集的令牌。第二次及所有后续执行将从其自己的输出引脚接收部分结果
扩展区域允许输出引脚,但在UML中没有定义语义。

ExpansionRegions也可以具有OutputPins和ActivityEdges,这些OutputPins或ActivityEdges从其中退出ExpansionRegion。但是,对于向此类OutputPins或ActivityEdges提供令牌的语义未定义。

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

当ExpansionRegion完成所有扩展执行时,它会在任何从这些节点发出的ActivityEdges上提供其输出集合(在执行ExpansionRegion期间不提供)。

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

图表存在问题

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

我按照你的建议做了跟进。希望我理解得正确。谢谢! - royconejo
1
很棒的动画!我刚刚发现了一个小错误:流向扩展节点的对象不再有箭头。 - Axel Scheithauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接