2014-09-24 69 views
1

将分享分配的cases和重复case分配给未分享的分配,还是优先保持每个分离?处理开关语句中的组合案例和重复的案例


为了说明一个简单的例子.. case 0180既包括w = 330所以它们已被合并;分配给x的值对于每个值都是不同的,因此它们被重复执行x分配。

switch(window.orientation) { 
    case 0: 
    case 180: 
     w = 330; 
     //break 
    case 0: 
     x = '-180px'; 
     //break 
    case -90: 
    case 90: 
     w = 480; 
     x = '0'; 
     break; 
    case 180: 
     x = '-80px'; 
     break; 
} 
+0

我不会合并,因为情况0和情况180有不同的x值(可能如果分支是相同的)。由于单纯难以阅读/稍后的可维护性,我会避免将案例合并。 – Will 2014-09-24 21:10:21

回答

3

当谈到做一个switch声明中每个元素不止一个操作,它总是最好不要重复同样的case两次。您可以通过总结相同的case下的所有代码片段来轻松实现此目的。

例如,如果你想在case 0case 1case 0和操作B进行操作A那么你应该做这样的事情:

switch(variable) { 
    case 0: 
     // operation A; 
    case 1: 
     // operation B; 
     break; 
} 

这将在case 0执行这两个操作AB,因为case 0上没有break

现在让我们假设你写的是这样的:

switch(variable) { 
    case 1: 
     x = 1; 
     break; 
    case 1: 
     x = 2; 
     break; 
} 

上面的代码最终会价值1分配给变量x。第二个case 1,说x = 2将永远不会达到,因为break声明在第一个case 1

所以,如果你有对case 0case 1执行不同的操作,但它们共享了一些操作,这是更好地分离的情况下重复的几行代码,而不是写case 1两次,因为这使你的代码更容易阅读和稍快。

因此,在你的代码,最好的方式来实现你想要的是这个:

switch(window.orientation) { 
    case 0: 
     x = '-180px'; 
     w = 330; 
     break; 
    case 180: 
     x = '-80px'; 
     w = 330; 
     break; 
    case -90: 
    case 90: 
     w = 480; 
     x = '0'; 
     break; 
} 
1

我要说不结合 - 过高犯了一个错误......像你这样的一个机会。第二个case 180将永远不会到达,因为第一个后面有break;

如果一切都一样,我认为可以合并,但(如-90,90)。

-1

它不能工作。只要中断指令被执行,交换机中的剩余代码就不会被执行。 您可以修复它是这样的:

switch(window.orientation) { 
    case 0: 
    case 180: 
     w = 330; 
    case 0: 
     x = '-180px'; 
     break; 
    case 180: 
     x = '-80px'; 
     break; 
    case -90: 
    case 90: 
     w = 480; 
     x = '0'; 
     break; 
    } 
+2

上面的第二个“情况0”和“情况180”完全没有。 – 2015-03-03 11:16:55

0

如果你运行静态分析工具,如Coverity,如果您将多个开关的情况下比如在下面的报告小错误 。

case -90: 
    // Intentionally fall through 
    case 90: 
     w = 480; 
     x = '0'; 
     break; 

更好地重复一些代码行,而不是做出一些不需要的错误。

 case -90: 
      w = 480; 
      x = '0'; 
      break; 
     case 90: 
      w = 480; 
      x = '0'; 
      break;