2016-03-01 13 views
2

我有以下代码(就像伪代码):我的伪代码匹配我的UML活动图吗?

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

回答

3

案例二有break,因此它不会调用情况下为三个算账。尽管案例二将表达式设置为three,但表达式在该点不进行评估,因此情况三不会被执行。 案例三必须调用默认情况,因为它没有break

expression决策节点到ActivityFinalNode的未标记连接是错误的。伪代码中不存在该路径,因为switch语句总是执行至少一个大小写或默认值。另外,退出expression决策节点的所有流程都必须有警卫(例如,[expression == ONE])。这个决定节点必须与所有其他卫兵分开。

FlowFinalNode(带有X的那个)也不严格地与ActivityFinalNode(带圆圈的那个)具有相同的含义。您应该仅使用FlowFinalNode来结束分叉的控制线程。 (来自spec:“一个FlowFinalNode是一个FinalNode,它通过消耗提供给它的令牌来终止一个流。”)无论哪种情况,在这个模型中,只要没有更多的代码,FlowFinalNode或者ActivityFinalNode就是正确的因为break只能切换开关箱。

此外,流程不会“流经”合并节点,它们以箭头结束于边界。如果我是你的助教,那么你会失去分数,也会因为标签中的决策节点而失去分数,这不在UML标准中。 哦,对了,还有警卫失踪的方括号。

uml-diagrams.org是一个非常好的UML资源,如果你不想读取上层建筑本身。

+0

案例二有一个突破,你是对的。但是在函数2()在情况2内完成后,表达式被设置为大小写(THREE)。所以这意味着我与案例三有联系,但也许我在图表上表示错了,对吧? – JohnDoe

+0

该表达式被设置为THREE,但该表达式评估的唯一一点是'switch(expression)'。您需要知道开关盒的声明是如何工作的,然后才能制作它的活动图。 – Eashi

+1

已编辑;具有一个退出流程的决策节点不是UML标准符合公平的,但我会在课堂上接受它,以防止学生平行绘制四个不同的箭头。 – Eashi

0

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

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

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

+1

他的意图可能是编写一个状态机,但他的代码是一个非常混乱的开关情况声明,我个人会在活动图中进行建模。 – Eashi

+1

@Eashi As说:YMMV。 '表达式'可以被看作是状态切换,标签是可以被采用的状态。特别是当你看到交换机内部的状态转换时。通常状态机被转换为switch语句。 –

+0

@ThomasKilian:我打算给你的答案投票,直到我到最后一段。首先,不清楚这是什么语言。 (Velocity使用#if作为正常的if!)其次,在编译时优化条件不应影响需要发生什么的规范。该标志可能被无效地反复测试,并且在功能上等同于编译器预处理步骤。 –