2013-08-22 3 views
5

Неправильная практика иметь корпус переключателя в корпусе переключателя? Если да, то какие альтернативы? Я не хочу использовать if/else if, если мне это не нужно.Неправильная практика иметь корпус переключателя в корпусе переключателя?

Вместо того чтобы делать некоторые, как:

if((this == 1) && (that == 1)){ //something } 
else if((this == 1) && (that == 2)){ //something } 
else if((this == 2) && (that == 3)){ //something } 

Я думал вдоль линий:

switch(this){ 
    case 1: 
     switch(that){ 
      case 1: 
       // something 
      break; 
      .... 
     } 
    break; 
    .... 
} 

Это выглядит действительно неправильно для меня. Неправильно в синтаксисе, но неправильно с точки зрения правильной практики.

+2

Я вижу случаи, когда все в порядке. Но я долго смотрел на него и видел, могу ли я найти более простой метод. –

+0

На самом деле не обман, но имеет соответствующую/интересную информацию: http://stackoverflow.com/questions/7807970/nesting-switch-cases-in-javascript-any-speed-advantage – Joum

+1

Чтобы получить соответствующие ответы, было бы лучше добавьте свой код к вопросу ... –

ответ

3

Избегайте следующий подход

switch(id) 
{ 
    case 1: 
    { 
     switch (subid) 
     { 
      case 4: 
       // nested code 
     } 
    } 
    case 2: 
     // some code 
} 

Предпочтительный подход и улучшить свой код, перемещая вложенной секции в метод

switch(id) 
{ 
    case 1: 
     SubSwtich(subid); 
     break; 
    case 2: 
     // some code 
} 

function SubSwtich(int subid) 
{ 
     switch (subid) 
     { 
      case 4: 
       // nested code 
     } 
} 
+0

Спасибо всем за отличные ответы. Я ценю все понимание. – seroth

3

Я считаю это плохой ценой. в большинстве случаев это невозможно.

вы можете извлечь «вспомогательные» шкафы-переключатели в методы.

7

Плохая практика - иметь огромные функции, которые делают много разных вещей. Если в корпусе коммутатора имеется коммутационный блок, это говорит о том, что ваша функция, вероятно, слишком велика, и вы должны рассмотреть возможность ее разделения на более мелкие, более понятные куски.

Но нет жестких правил; все зависит от конкретного сценария.

0

Плохая практика? Нет! Вероятная боль, когда дело доходит до устранения неполадок, возможно! Посмотрите, что вы можете сделать, чтобы превратить все «опции» в нечто более организованное и обычно связанное. Возможно, даже напишите свою собственную функцию, используя перегрузку метода, определяемую количеством отправляемых параметров.

Посмотрите at this SO post и посмотрите, дает ли он вам некоторые идеи.

0

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

private void Switch(int value) 
    { 

     switch (value) 
     { 
      case 1: 
       SwitchNest(value); 
       break; 
      case 2: 
       break; 
     } 
    } 

    private void SwitchNest(int value) 
    { 
     switch (value) 
     { 
      case 1: 
       SwitchOtherMethod(value); 
       break; 
      case 2: 
       break; 
     } 
    } 
+0

Функция для разового использования, я бы утверждала, не стоит. Не говоря уже о том, что вы сейчас прыгаете местами внутри кода, чтобы следить за рабочим потоком вместо одного места. (С точки зрения удобочитаемости, и это может быть ИМХО, я предпочитаю просеивать через вложенные переключатели, нежели преследовать одноразовые функции.) –

1

Если это делает ваш код труднее читать, то это плохо практика.

Независимо от того, подходит ли это вашему конкретному примеру, решать вам, но в целом я бы сказал, что, вероятно, так будет.

Вы просили альтернативы ...

  1. Extract часть вашего кода в подфункции. Например:

    case 'foo' : 
        myVar = 'blah'; 
        break; 
    case 'bar' : 
        myVar = secondLevelFunction(); 
        break; 
    

    Здесь secondLevelFunction() содержит дополнительный switch() заявление, в котором каждый case возвращает значение myVar.

  2. Использование сопоставления массива.Например:

    var mapper = {'foo':'blah', 'bar':'bibble', etc}; 
    
    //now, instead of a big switch(input) { .... } block that sets myVar 
    //for each option, you can just set it directly in a single line, like so: 
    var myVar = mapper[input]; 
    

Кроме того, если вы ищете конкретные меры качества кода, вы должны узнать о Cyclomatic Complexity. Это показатель того, насколько сложна функция. Измерение производится путем просмотра того, сколько «точек принятия решений» имеет функция. Каждый case, if, цикл и т. Д. Является «точкой принятия решения». Чем больше у вас есть, тем сложнее ваша функция.

Cyclomatic Complexity тесно связан с качеством кода и хорошими правилами кодирования, поэтому, если ваша функция имеет высокий балл CC (что, вероятно, будет делать, если у него много вложенных блоков switch), то это признак плохого качества кода , Оба альтернативных решения, описанные выше, могут помочь в этом. Я оставлю это вам, чтобы больше узнать о CC.

Очевидно, что альтернативные решения должны быть адаптированы к вашим потребностям, но, надеюсь, они дают вам некоторые идеи.

Смежные вопросы