我现在正在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元素而不是决策(钻石)元素?
我想知道如何正确设计。有什么规定吗?
你的想法中有一个错误的假设。ADecision没有输出。它只有条件控制流离开它。每个都可以受到一定条件的保护。这个守卫写在方括号中:
请注意,我在第一次测试后没有编写(隐式)[true]防护(而是编辑时的草率,但实际上可以省略)。
编辑我的第一个,尽管您的图表还有另一个缺陷,即操作没有控制流出去是不正确的。实际上,上层结构指出,丢失的传出控制流相当于FlowFinal处理后的Action. 所以你的图表在这里是正确的。
关于您的编辑:正如评论所说,这是为了并行延续。嵌套条件需要如上所示。
\n\nEdit2正如 Ister 在评论中指出的那样, aDecision不仅可以有if和else控制流出去,还可以有大于 1 的任意数字。 UML 2.5 在第 14 页上指出。388:
\n\n如果畅通的传出边缘的恰好一个目标接受了令牌,则令牌将穿过相应的边缘,并且撤回所有其他要约。如果多个目标同时接受令牌,则令牌仅遍历接受目标对应的边之一,但本规范未确定是哪一条边。
\n\n为了避免非确定性行为,建模者应该安排最多一个守卫对每个传入令牌评估为 true。如果可以确保只有一个防护评估为真,则一旦发现一个防护评估为真,则不需要一致的实现来评估所有传出边缘上的防护。
\n\n仅与 DecisionNode 一起使用时,预定义的保护 \xe2\x80\x9celse\xe2\x80\x9d (表示为以 \xe2\x80\x9celse\xe2\x80\x9d 作为其运算符且无操作数的表达式)至多一个传出边缘。仅当决策节点的任何其他传出边缘不接受该令牌时,此防护才会评估为 true。
\n