2014-09-24 62 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;