我有以下代码(就像伪代码一样):
switch (expression)
{
case (ONE)
{
#if(FLAG==ON)
Function1()
#endif
break;
}
case(TWO)
{
if(x==y)
{
Function2();
expression = THREE;
}
break;
}
case(THREE)
{
Function3();
}
default:
{
Function4:
break;
}
}
我尝试创建一个UML活动图(参见附件),并且不确定我是否在某些方面更正:
感谢任何反馈!
答案 0 :(得分:3)
案例二有一个break
,因此事后不会调用案例三。即使案例2将表达式设置为three
,表达式也不会在该点进行求值,因此不会执行第三种情况。
案例3必须调用默认情况,因为它没有break
。
从expression
决策节点到ActivityFinalNode的未标记连接是错误的。伪代码中不存在该路径,因为switch语句始终至少执行一种情况或默认情况。此外,退出expression
决策节点的所有流都必须有一个保护(例如[expression == ONE]
)。每个警卫必须与该决策节点的所有其他警卫分开。
FlowFinalNode(带有X的那个)也没有严格意义上与ActivityFinalNode(带圆圈的那个)具有相同的含义。您应该仅使用FlowFinalNode来结束分叉的控制线程。 (来自规范:“FlowFinalNode是一个FinalNode,通过使用提供给它的令牌来终止流。”)在任何一种情况下,只要没有更多的代码,在这个模型中,FlowFinalNode或ActivityFinalNode只是正确的。切换案例,因为break
仅结束切换案例。
此外,流不会“流过”合并节点,它们以箭头结束在边框上。如果我是你的TA,你会失去分数,以及带有标签的决策节点,这不是UML标准。 哦,对了卫兵上丢失的方括号。
如果您不想阅读上层结构本身,uml-diagrams.org是UML的一个非常好的资源。
答案 1 :(得分:0)
实际上,您的代码代表状态机,而不是活动流。
当然,您也可以将其写为活动,但这似乎并不合理。
FWIW:您将条件编译(#if)建模为流。这是完全错误的。你需要两个模型。一个是#if是真的,一个是假的。这不是运行时条件。