Activity 有几个初始节点:必须启动所有节点才能开始 Activity 吗?

Activity with several initial nodes: must all of them be started for the Activity to begin?

如果activity有一个初始节点和一个入参节点怎么办? activity 能否在输入节点处有可用对象之前启动?在所附 https://de.wikipedia.org/wiki/Aktivit%C3%A4t_(UML) 的示例中,“煮水 (Wasserkochen)” activity 是否可以在没有意大利面的情况下开始?

一个activity不负责它的开始,它的执行开始是从它的外部完成的。即使是可能的先决条件也不是 activity 本身的一部分,而是从行为继承的。

来自formal/2017-12-05 15.3.3.1初始节点:

If an Activity has more than one InitialNode, then invoking the Activity starts multiple concurrent control flows, one for each InitialNode.

来自 formal/2017-12-05 15.2.3.6 Activity 执行:

When an Activity is invoked, any values passed to its input Parameters are put in object tokens and placed on the corresponding input ActivityParameterNodes for the Activity (if an input parameter has no value, a null token is placed on the corresponding ActivityParameterNode).

When an Activity is first invoked, none of its nodes other than input ActivityParameterNodes will initially hold any tokens.

根据您的编辑,您谈到 ActivityParameterNode,而您的输入参数节点没有值,执行开始(操作 Wasserkochen 已完成)但无法执行操作 Spaghetti einfullen

您示例中的 activity 将在启动节点发出令牌后启动。意大利面条是否已经出现在对象节点是无关紧要的。只有当满足开始条件并且开始节点发出令牌时,activity 才会从第一个动作开始。只有这样,动作“Spaghetti einfüllen”才会等待意大利面 - 或者如果已经存在则使用它们。

现在,为什么“Spaghetti einfüllen”动作挂在不存在的意大利面条上?简单地说,它有两个令牌必须到达才能开始。一个来自“Wasser kochen”,另一个是对象“Spaghetti [roh]”。只有当两者都存在时,动作才会开始。当然,如果只有意大利面,那么上一个动作“Wasser kochen”的第二个令牌也必须在那里。

您可以在 UML 2.5 第 441 页的第 16.3.2.1 段中阅读有关何时开始或不开始动作的所有详细信息。

此外,正如@GeertBellekens 指出的那样,第 15.5.3.1 页上有第 15.5.3.1 段。 401 表示

An ExecutableNode shall not execute until all incoming ControlFlows (if any) are offering tokens. That is, there is an implicit join on the incoming Control Flows. Specific kinds of ExecutableNodes may have additional prerequisites that must be satisfied before the node can execute.

虽然已经有一些答案,但我认为添加一些上下文是很好的。

activity是对行为的描述。问题是这种行为在某些虚无中不存在。相反,尤其是在使用输入和输出参数时,它是某些更大行为的一部分(表示为特殊操作类型 - activity 调用)。现在为了更好地理解将会发生什么,您需要查看两种类型的 activity 边。

activity 边控制 activity 的流向。边缘有两种类型——控制流和对象流。当除 fork 之外的节点完成执行时,它只提供一个控制令牌,然后遵循可用的控制流之一。在正确建模的 activity 中,应该遵循哪个控制流是没有歧义的。

除了控制流之外,可能还有对象节点。这些用于显示对象(例如文档)如何通过 activity。 activity 中可能有许多重要的对象,其中一些(甚至全部)可能有其专用的对象流。因此 UML 引入了与控制流并行的对象流的概念。不幸的是,这里有两件令人困惑的事情。首先,对象流和控制流使用完全相同的表示法——一条末端带有空心箭头的实线。唯一的区别是对象流在对象节点开始和结束,而控制流在控制节点开始和结束。对于新手来说,这可能会造成混淆,因为假设相似的行可能有两种不同的含义。但还有更多。

有时 activity 的主要(控制)流程由对象控制...。通常只有一个对象由一个动作生成并传递给下一个动作。只有在将对象交付给它后,才会激活下一个动作。所以控制流和对象流必须同时发生。问题出在 activity 图上,它可以通过仅显示对象流来描述。然后并行控制流是隐式的。

这对您的案件有何影响?

如果对您的 activity 的调用是一个更大进程的一部分,并且唯一的传入流是一个对象流到名为 Spaghetti [roh/raw][= 的输入引脚36=] 然后你的 Start node 将被触发(产生一个控制令牌)只有当 Spaghetti [roh/raw][=36 上有可用的对象时=] 对象节点。在这种情况下,水煮熟后(Wasser kochen/cook water 动作完成)总会有意大利面加入 Spaghetti einfüllen/add spaghetti .

但是,如果您有一个单独的控制流,当 Spaghetti [roh/raw] 上没有可用的对象令牌时,控制令牌可能会到达。根据规范,这意味着将在该对象节点上放置一个空令牌。换句话说,activity 将执行,但可用的意大利面条数量将为空。所以水仍然会被煮沸,然后 Spaghetti einfüllen/add spaghetti 动作将被执行。如何处理“错误的”对象令牌取决于操作。它可以简单地将其视为 0 量的意大利面条并继续(因此您继续烹饪 10 分钟,然后在输出参数处产生另一个空标记)或者它可以由某种异常处理。无论哪种情况,Wasser kochen/cook water 动作只会持续到其内部行为被执行,所以不,除非你允许,否则你不会在沸水中结束,直到它全部蒸发null spaghetti [roh/raw] 令牌的内部异常处理收到 Spaghetti einfüllen/add spaghetti 操作中的异常。