如何在UML中设计决策后的决策(钻石)?

Van*_*ard 6 uml

我现在正在ArgoUML中设计UML活动图。我知道,如果我想设计如下条件:

if(condition) {
    doTrueAction();
} else {
    doFalseAction();
}
Run Code Online (Sandbox Code Playgroud)

可以在UML活动图中完成,如下所示:

在此处输入图片说明

但是,如果我们在先前决策的输出中还有另一个条件怎么办?像这样:

if(condition) {
    if(condition2) {
        condition2TrueAction();
    } else {
        condition2FalseAction();
    }
}else{
    conditionFalseAction();
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如您所见,这里同时输出conditionTrueOutput和condition。在我看来,设计已损坏。

编辑:还是我应该使用fork元素而不是决策(钻石)元素?

在此处输入图片说明

我想知道如何正确设计。有什么规定吗?

qwe*_*_so 2

你的想法中有一个错误的假设。ADecision没有输出。它只有条件控制流离开它。每个都可以受到一定条件的保护。这个守卫写在方括号中:

\n\n

在此输入图像描述

\n\n

请注意,我在第一次测试后没有编写(隐式)[true]防护(而是编辑时的草率,但实际上可以省略)。

\n\n

编辑我的第一个,尽管您的图表还有另一个缺陷,即操作没有控制流出去是不正确的。实际上,上层结构指出,丢失的传出控制流相当于FlowFinal处理后的Action. 所以你的图表在这里是正确的。

\n\n

关于您的编辑:正如评论所说,这是为了并行延续。嵌套条件需要如上所示。

\n\n

Edit2正如 Ister 在评论中指出的那样, aDecision不仅可以有ifelse控制流出去,还可以有大于 1 的任意数字。 UML 2.5 在第 14 页上指出。388:

\n\n
\n

如果畅通的传出边缘的恰好一个目标接受了令牌,则令牌将穿过相应的边缘,并且撤回所有其他要约。如果多个目标同时接受令牌,则令牌仅遍历接受目标对应的边之一,但本规范未确定是哪一条边。

\n\n

为了避免非确定性行为,建模者应该安排最多一个守卫对每个传入令牌评估为 true。如果可以确保只有一个防护评估为真,则一旦发现一个防护评估为真,则不需要一致的实现来评估所有传出边缘上的防护。

\n\n

仅与 DecisionNode 一起使用时,预定义的保护 \xe2\x80\x9celse\xe2\x80\x9d (表示为以 \xe2\x80\x9celse\xe2\x80\x9d 作为其运算符且无操作数的表达式)至多一个传出边缘。仅当决策节点的任何其他传出边缘不接受该令牌时,此防护才会评估为 true。

\n
\n