Conditional Nodes

ConditionalNode是一个StructuredAcitivityNode,它在一组可选的ExecutableNodes中选中一个来执行。ConditionalNode包括1个或多个子句(Clause),每一个代表了一个条件分支。子句包含一个test部分和一个body部分,用于鉴别ConidtionalNode中包含的ExecutableNodes的不相交的子集。ConditionalNode中的任意ExecutableNode都必须只能包含在一个子句的testbody部分。

当ConditionalNode开始执行时,其中的InitialNodes会立即使能。其中的ExecutableNode只有在包含它的testbody部分按照如下说明的方式执行时才会使能。当一个testbody部分执行时,如果所包含的ExecutableNode没有必须的输入数据和来自相同testboby部分的进入的ControlFlow,那么它就使能并接受一个单一的控制token。执行按照Activities的一般语义,但提交给一个不在执行态的testbody部分中的一个ExecutableNode的tokens不会立即交付而是处于待定状态。目标Executable可能会最终由于包含它的testbody部分的执行而接受这些待定的tokens。

一旦ConditionalNode开始执行,它所有子句中没有predecessorClauses的子句的test部分开始执行(至于是顺序执行还是并发执行,还是一些组合的方式,本规范未定义)。每个test部分包含一个拥有decider OutputPin的Action,该OutputPin类型为Boolean且由test所属的子句指定。test部分的结果值放于decider OutputPin。如果一个或多个test值为真,那么相应的body部分就可以执行。接下来,对于所有predecessorClausestest部分都没产生真值的子句的test部门开始执行。这个过程一直持续到没有test部分需要执行。

注意. 当test部分被指定为“并发”执行时,意味着模型没有给它们的执行设置先后次序。通常,这样的test部分可以以任何次序执行,包括同时(如果执行引起支持的话)。为了强制执行次序,可以通过在子句中指定前趋和后继约束。一种通常的情形是全序,即每个test的执行次序是确定的。如果多个test部分不可能同时产生真,那么结果仍是确定的,并且不必给子句指定指定次序,因为指定次序可能对实现带来不希望或不必要的约束。

如果ConditionalNode的isAssured为真,这断言至少一个test部分将产生一个真值。如果isDeterminate为真,这断言之多一个test部分将产生真值(predecessorClause关系将用来确保这个断言)。

注意. 通常很难自动的校验这些断言,也不必强制它们,但它们会向执行引擎提供有用的信息。如果违反了断言,那么模型就是错误的。

一旦test部分执行完毕,如果只有一个body部分准备执行,那么它就执行,如果是多个body部分准备执行,那么只有一个能够执行,但究竟是哪一个是不可预测的。如果没有使能的body部分要执行,那么ConditionalNode执行完毕,不产生额外影响。

“else”子句是ConditionalNode中所有其它子句的后继,它的test部分总是真。该子句的body部分在ConditionalNode中没有其它bdoy部分使能时使能。这确保了ConditionalNode中至少总是有一个body会执行。

当一个body部分要执行时,它可能会在任何接续的test部分执行结束之前执行。此种情形下,任何接续test部分的执行被终结而且后续的test部分也不会执行。(如果一些test产生了外部影响,终结它们可能会带来不确定性。尽管test部分允许带来副作用,避免这些副作用将会减少逻辑错误和竞争条件。)

ConditionalNode有一个有序的result OutputPins集合。ConditionalNode的每个子句必须有一个匹配的bodyOutput OutputPins集合。对于每一个result OutputPins,每个子句必须有一个相应的bodyOutput。如果一个子句的body部分执行,那么一旦执行结束,子句的bodyOutputs上的所有tokens会被移送到ConditionalNode响应的result OutputPins。ConditionalNode结束后,所有OutputPins上的tokens被提交给出边。任何没有持有tokens的OutputPins为出边提供空tokens。如果ConditionalNode中没有一个test部分产生真值,那么就没有body部分执行,也不会再任何OutputPins上产生tokens,它们将产生空tokens。

一旦ConditionalNode执行完毕,其内部的执行会被终结,内部产生的tokens都被销毁。如果ConditionalNode直接包含一个在自身执行过程中接受了一个token的ActivityFinalNode,那么该ConditionalNode会立即结束。只有直接包含AcitivityFinalNode的ConditionalNode是这种情况,而不是外层的Activity或其它StructuredActivityNodes。

ConditionalNode可能具有InputPins。

results matching ""

    No results matching ""