1

Можно ли объединить cases, которые разделяют назначения и повторяют case для присвоений, которые не являются общедоступными, или предпочитают просто сохранять каждый отдельно?Работа с совпадающими случаями и дублирующимися случаями в операторах switch


Чтобы проиллюстрировать на простом примере .. case 0 и 180 оба включают 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

ответ

3

Когда дело доходит сделать более одной операции для каждого элемента в switch заявлении, это всегда лучше, чтобы не повторить ту же case дважды. Вы можете легко достичь этого, суммируя все фрагменты кода, которые находятся под тем же case.

Например, если вы хотите выполнить операцию A на case 0 и эксплуатации B на case 0 и case 1, то вы должны сделать что-то вроде этого:

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

Это будет выполнять как операцию A и B на case 0, потому что нет break на case 0.

Теперь давайте предположим, что вы пишете что-то вроде этого:

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

Приведенный выше код будет в конечном итоге присвоения значения 1 переменной x. Второй case 1, говорящий, что x = 2 никогда не будет достигнуто, из-за заявления break в первом case 1.

Так что если у вас есть, чтобы выполнять различные операции на case 0 и case 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

Не может работать. Как только выполняется команда break, оставшийся код в блоке переключения не выполняется. Вы можете исправить это следующим образом:

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» в вышеизложенном ничего не делают. –

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;