Uml 具有多个初始节点的活动:必须启动所有节点才能开始活动?

Uml 具有多个初始节点的活动:必须启动所有节点才能开始活动?,uml,Uml,如果活动有一个初始节点和一个输入参数节点,该怎么办?活动能否在输入节点上有可用对象之前启动?在附件中的示例中,“沸水(Wasserkochen)”活动是否可以在没有意大利面的情况下开始? 活动不负责其启动,其执行启动是从外部完成的。即使是可能的前提条件也不是活动本身的一部分,而是从行为继承而来的 从正式/2017-12-05 15.3.3.1初始节点: 如果一个活动有多个InitialNode,则调用该活动将启动多个并发控制流,每个InitialNode对应一个 从正式/2017-12-05 1

如果活动有一个初始节点和一个输入参数节点,该怎么办?活动能否在输入节点上有可用对象之前启动?在附件中的示例中,“沸水(Wasserkochen)”活动是否可以在没有意大利面的情况下开始?

活动不负责其启动,其执行启动是从外部完成的。即使是可能的前提条件也不是活动本身的一部分,而是从行为继承而来的

从正式/2017-12-05 15.3.3.1初始节点:

如果一个活动有多个InitialNode,则调用该活动将启动多个并发控制流,每个InitialNode对应一个

从正式/2017-12-05 15.2.3.6活动执行开始:

调用某个活动时,传递给其输入参数的任何值都将放入对象标记中并放置在 活动的对应输入ActivityParameterNodes(如果输入参数没有值,则放置空标记 在相应的ActivityParameterNode上

第一次调用活动时,除了输入ActivityParameterNodes之外,其所有节点最初都不会持有任何令牌


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

示例中的活动将在开始节点发出令牌后开始。在对象节点上是否有意大利面是无关紧要的。只有在满足启动条件且启动节点已发出令牌时,活动才会从第一个操作开始。只有到那时,“意大利面条艾因弗伦”动作才会等待意大利面条——或者如果已经有了,就使用它们

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

您可以阅读UML2.5第441页第16.3.2.1段中关于何时开始或不开始操作的所有血淋淋的细节

此外,正如@GeertBellekens指出的,第15.5.3.1段中有第。401哪个州

在所有传入控制流(如果有)提供令牌之前,ExecutableNode不得执行。也就是说,传入控制流上存在隐式连接。特定类型的可执行节点可能具有附加的先决条件,在节点可以执行之前必须满足这些先决条件


虽然已经有了一些答案,但我认为最好添加一些上下文

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

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

除了控制流之外,还可能有对象节点。这些用于显示对象(例如文档)如何在活动中传递。活动中可能有许多重要的对象,其中一些(甚至全部)可能有专用的对象流。因此UML引入了与控制流并行的对象流的概念。不幸的是,这里有两件令人困惑的事情。首先,对象流和控制流使用完全相同的表示法-一条实线,末尾有一个开放的箭头。唯一的区别是对象流在对象节点开始和结束,而控制流在控制节点开始和结束。对于新手来说,这可能会令人困惑,因为据推测,类似的行可能有两种不同的含义。但还有更多

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

这对你的案子有什么影响

如果对您的活动的调用是更大流程的一部分,并且唯一传入的流是指向名为Spaghetti[roh/raw]的输入pin的对象流,则只有当Spaghetti[roh/raw]对象节点上有可用对象时,才会触发启动节点(生成控制令牌)。在这种情况下,水煮熟后(Wasser kochen/煮水动作完成),总会有意大利面条加入意大利面条einfüllen/加入意大利面条

但是,如果您有一个单独的控制流,那么当意大利面[roh/raw]上没有可用的对象令牌时,控制令牌可能会到达。根据规范,这意味着将在该对象节点上放置一个空标记。换句话说,活动将执行,但可用的意大利面数量将为空。因此,水仍将煮沸,然后将执行意大利面einfüllen/add Spaghetti操作。如何处理“错误的”对象标记取决于操作。它可以简单地将其视为0量的意大利面并继续(因此您可以继续烹饪10分钟,然后在输出参数处生成另一个空标记),也可以是ha