如何在活动图中使用扩展区域来处理循环?

7

我在设计合适的UML活动图时遇到了问题。

我看过类似的问题和可能的答案: 如何在活动图中表示循环?

即使有这些答案,我仍然有疑虑,而且我的答案与UML定义不符。

问题概述:对每个文件夹中的文件夹和文件进行循环操作,根据其名称对每个文件夹进行操作并根据其名称对每个文件进行操作。我遇到的主要问题是是否正确使用了扩展区域。

许多资料说扩展区域必须有输入集合和输出集合。但我不一定需要输出集合。

在进入ActivityFinal之前,区域会自动假定迭代所有项目,直到没有项目可以迭代吗?

这是我所做的Enterprise Architect截图: enter image description here


2
“但我不一定有一个输出集合。”这句话实际上是指你有一个“空集合”吗? - qwerty_so
@ThomasKilian 我有一个输入集合,我要迭代它。根据所采取的行动,我会对另一个不属于循环本身的集合进行操作。 - Jax Teller
2个回答

4
首先,你的扩展节点应该连接控制流或者你的活动应该使用对象流连接,而两者都不可行(遗憾的是,EA并没有强制执行这个规则)。这意味着你需要在初始节点之后添加一个活动,以提供给你一个集合。另外,在活动图中你正在使用活动。与普遍的看法(包括EA)相反,这是不允许的。应该使用操作(可能是调用活动的CallBehaviorActions,但这取决于你)。
我不知道你具体要建模什么。但是这里是关于如何有效使用扩展区域的建议: enter image description here 第一个扩展节点为目录中的每个文件夹创建一个对象令牌。第二个扩展节点为每个文件夹中的每个文件创建一个对象令牌。如果你需要访问文件夹名称,可以简单地将对象流绘制到区域中。这将为每次内部扩展区域的执行提供单独的文件夹令牌。
如果你不需要输出扩展节点,那么就没有必要对其进行建模。只需在每次执行结束时以流终止节点结束。在最后一个执行完成后,该区域将为传出的控制流产生一个令牌。

感谢您的解释。扩展区域的出站控制流在我的EA中不可能,我只能获得依赖选项。除非我将ControlFlow添加到其他内容中,然后手动将其移动到扩展区域。现在我明白了活动节点的重点。 - Jax Teller
EA只是尝试猜测在某种情况下哪些关系是有意义的,并在快速链接菜单中提供这些关系。UML包含许多关系,因此EA并不总能猜测出您需要什么。但是,您始终可以在工具箱中查找关系并从那里创建它。 - Axel Scheithauer
我只是粗略地浏览了规格,没有发现在参数中使用箭头的任何用途。那更像是SysML。你选择的工具是什么?它不是EA,因为它仍然使用三个分开的框,而标准(以及你的工具)显示四个。 - qwerty_so
@ThomasKilian:您是指扩展节点吗?规范中没有示例,但小箭头的符号在第16.12.4节中提到。我在这个图中使用的工具是Magic Draw。 - Axel Scheithauer
不行。我正在研究正式/2015-03-01。 - qwerty_so
在这份文件中,它说:“可以像针脚一样使用小箭头来扩展节点”。从技术上讲,并没有提到可以显示多个箭头。然而,我认为这应该由工具供应商的艺术自由来涵盖。 - Axel Scheithauer

1
根据你的回复,它只是一个你正在操作的对象。

enter image description here

您可以将该对象放置在扩展区域之外的全局上下文中。输入/输出参数保持不变。它们类似于过程参数。如果您操作外部(全局)对象,您的返回值将是一些空集合(可能还有一些关于处理外部对象的信息)。

你知道吗,如果我没有输出集合(空集合),我如何从一个循环向另一个循环发出信号呢?例如,在第一个循环中,我想循环遍历一个集合,然后在嵌套循环中,循环遍历另一个集合,执行一些操作/活动,填充/更改单独的集合(全局,正如你所提到的)。如果当前项不符合条件,你会如何跳到迭代中的下一项?但是,活动结束会指示活动的结束,这也意味着整个循环的结束? - Jax Teller
1
你不应该尝试“图形化编程”。这个任务应该留给程序员。你的AD应该提供一个概述而不是详细的编码指导。你可以使用结构化活动(EA上下文菜单中的第二个选项)来处理这些细节。但是,不要过度使用。 - qwerty_so
是的,我认为这是UML新手面临的主要问题之一。谢谢。 - Jax Teller

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