我的伪代码是否与我的UML活动图匹配?

时间:2016-03-01 10:27:28

标签: switch-statement uml flowchart

我有以下代码(就像伪代码一样):

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活动图(参见附件),并且不确定我是否在某些方面更正:

  • 这些2"流程是否最终"点数正确映射或它们应该一起进入一个"流程最终"点? - 另请注意,最后一个CASE没有休息声明。

感谢任何反馈!

enter image description here

2 个答案:

答案 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是真的,一个是假的。这不是运行时条件。