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

Does My Pseudocode Match My UML Activity Diagram?

我有以下代码(只是伪代码):

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 activity 图(见附件)但不确定我在某些方面是否正确:

如有任何反馈,我们将不胜感激!

案例二有一个break,因此以后不会调用案例三。即使情况二将表达式设置为 three,此时表达式还没有被计算,因此情况三将不会被执行。 案例三必须调用默认案例,因为它没有 break.

expression 决策节点到 ActivityFinalNode 的未标记连接是错误的。该路径在伪代码中不存在,因为 switch 语句总是至少执行一种情况或默认情况。此外,所有退出 expression 决策节点的流都必须有一个守卫(例如,[expression == ONE])。对于此决策节点,每个守卫都必须与所有其他守卫分离。

FlowFinalNode(带有 X 的节点)与 ActivityFinalNode(带有圆圈的节点)的含义也不完全相同。您应该仅使用 FlowFinalNode 来结束分叉的控制线程。 (来自规范:“FlowFinalNode 是一个 FinalNode,它通过消耗提供给它的令牌来终止流。”)在任何一种情况下,在此模型中,只要没有更多代码在下面,FlowFinalNode 或 ActivityFinalNode 都是正确的switch case 因为 break 只结束 switch case。

此外,流程不会“流经”合并节点,它们以箭头结束于边界。如果我是你的助教,你会因此而失分,以及其中带有标签的决策节点,这不在 UML 标准中。 哦对了,还有卫兵上缺少的方括号。

uml-diagrams.org 是一个非常好的 UML 资源,如果你不想阅读上层结构本身的话。

实际上您的代码表示状态机而不是 activity 流。

当然,你也可以写成activity,但好像不太合理

FWIW:您将条件编译 (#if) 建模为流程。这是完全错误的。你需要两个模型。一种是#if 为真,另一种是假。这不是运行时条件。