【问题标题】:Does My Pseudocode Match My UML Activity Diagram?我的伪代码是否与我的 UML 活动图匹配?
【发布时间】:2016-03-01 10:27:28
【问题描述】:

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

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 没有 break 语句。

感谢任何反馈!

【问题讨论】:

    标签: switch-statement uml flowchart


    【解决方案1】:

    案例二有一个break,因此它不会在之后调用案例三。即使 case 2 将表达式设置为 three,但此时不会计算表达式,因此不会执行 case 3。 案例三必须调用默认案例,因为它没有break

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

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

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

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

    【讨论】:

    • 案例二有休息,你是对的。但是在 Function2() 在 case 2 中完成后,表达式被设置为 case(THREE)。所以这意味着我必须与案例三有联系,但也许我在图表上表示错了,对吧?
    • 表达式设置为三,但唯一计算此表达式的点是switch (expression)。在制作活动图之前,您需要了解 switch case 语句的工作原理。
    • 已编辑;为案例拆分一个退出流的决策节点不符合 UML 标准,但我会在课堂上接受它,以防止学生并行绘制四个不同的箭头。
    • 还有一个问题需要指出:伪代码在重置后不会重新计算expression。因此,它不能不连接到图中的合并菱形。
    【解决方案2】:

    实际上,您的代码代表状态机而不是活动流。

    当然,你也可以把它写成活动,但这似乎不合理。

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

    【讨论】:

    • 他的意图可能是写一个状态机,但他的代码是一个非常混乱的 switch case 语句,我个人会在活动图中建模。
    • @Eashi 正如所说:YMMV。 expression 可以看作是状态开关,标签是可以采取的状态。尤其是当您看到交换机内部的状态转换时。通常将状态机转换为 switch 语句。
    • @ThomasKilian:我打算对你的答案投赞成票,直到我读到最后一段。首先,不清楚这是什么语言。 (Velocity 使用#if 表示正常的 if!)其次,在编译时优化条件不应该影响需要发生的事情的规范。该标志可能会被反复测试效率低下,并且在功能上等同于编译器预处理步骤。
    • @JimL。这段代码使用了 if 和 #if,所以我假设它是一个预编译器指令。
    猜你喜欢
    • 2020-04-04
    • 2011-09-06
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2021-06-05
    • 1970-01-01
    相关资源
    最近更新 更多