Зачем использовать переключение устава вместо того, если еще отметки? - PullRequest
9 голосов
/ 02 февраля 2010

Переключатели кажутся настолько бесполезными, что их можно заменить на операторы if-else, которые могут сделать гораздо больше, чем просто совпадение с char / int / enum и т. Д. Я могу думать только об одном хорошем использовании переключателя, и это будетдля интерпретации аргументов командной строки.

Какое реалистичное использование для оператора switch?

Ответы [ 18 ]

27 голосов
/ 02 февраля 2010

Есть несколько случаев, когда переключатель более читабелен и удобен. Обычно, когда у вас есть группировка опций.

Вот один из них:

    int numDays = 0;
    int month = 2;
    int year = 2010;

    // find the number of days in the month
    switch (month) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            numDays = 31;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            numDays = 30;
            break;
        case 2:
            if ( ((year % 4 == 0) && !(year % 100 == 0))
                 || (year % 400 == 0) )
                numDays = 29;
            else
                numDays = 28;
            break;
        default:
            System.out.println("Invalid month.");
            break;
    }
25 голосов
/ 02 февраля 2010

На мой взгляд, есть две причины использовать переключатель против if / else:

  • Компилятор может оптимизировать работу коммутатора лучше.
  • Оператор switch более четко выражает логику кода. В частности, идея, что вы выбираете другую ветвь в зависимости от ценности чего-то, а не в зависимости от более сложной логики Это, безусловно, более важная причина для меня.
18 голосов
/ 02 февраля 2010

Вы должны помнить, что переключатели проще обслуживать - целая куча вложенных if и elses может быстро стать проблемой для обслуживания.

Переключатели облегчают вставку нового футляра.

9 голосов
/ 02 февраля 2010

Я использую переключатели, когда использую перечисление, чтобы указать, какие действия должен выполнять мой метод. Это помогает, когда действия являются взаимоисключающими.

7 голосов
/ 02 февраля 2010

Переключатели оптимизированы на многих языках для определенных контекстов. Часто, когда это возможно, они создают таблицу переходов или даже хэш-таблицу. Действительно, когда возможно использовать переключатель, очень вероятно, что он будет работать лучше, чем (логически) тот же код, использующий if / else.

4 голосов
/ 02 февраля 2010

Я всегда использую переключатели, если сравниваю одну и ту же переменную для нескольких значений - переключатель гораздо быстрее кодировать (и легче поддерживать), чем длинная цепочка if-elseif.Представьте себе, что вы меняете имя переменной: с переключателем это будет одно редактирование, а с цепочкой if-elseif будет несколько.«feature», где, как и в случае цепочки if-elseif, вы получите дублированный код.

4 голосов
/ 02 февраля 2010

Существует ряд ситуаций, одна из которых нам приходится иметь дело со многими, если у вас много опций, синтаксис немного сжат, и иногда его легче читать, чем синтаксис if / then.

Хотя можно привести аргумент в пользу того или иного пути, я считаю, что переключатели, в случае нескольких вариантов, легче читать, поддерживать и понимать. Я также использовал его в заводской типовой ситуации, которая помогает документировать.

3 голосов
/ 02 февраля 2010

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

2 голосов
/ 02 февраля 2010

Мне кажется, что главное преимущество переключателя состоит в том, что он сразу делает читателю очевидным, что все параметры зависят от одной и той же переменной. Вы, конечно, могли бы написать блок if / elseif / elseif, который выполнил бы то же самое, но тогда читателю пришлось бы тщательно проверять, действительно ли это одна и та же переменная, проверяемая каждый раз.

Существует также сценарий обслуживания кошмара, в котором у вас есть длинный if / elseif для одной и той же переменной, и кто-то решает изменить имя переменной, и поэтому он меняет все if, если только он не пропустил.

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

2 голосов
/ 02 февраля 2010

В случае Perl, использование оператора switch может значительно уменьшить сложность вашего кода.

Просто сравните эти два примера.

  • Использование given / when:

    use feature qw'switch';
    my $num_days;
    given( $month) {
      when( [ 1,3,5,7,8,10,12 ] ){ $num_days = 31 }
      when( [ 4,6,9,11 ] ){ $num_days = 30 }
      when( 2 ){
        $num_days = 29;
        $num_days = 28 if     $year % 4;
        $num_days = 28 unless $year % 100;
        $num_days = 29 unless $year % 400;
      default{ print "Invalid month.\n" }
    }
    
  • Использование for в качестве замены для нового ~~ (умный-матч) оператор.

    my $num_days;
    for( 1,3,5,7,8,10,12 ){
      if( $month == $_ ){
        $num_days = 31;
        last;
      }
    }
    for( 4,6,9,11 ){
      if( $month == $_ ){
        $num_days = 30;
        last;
      }
    }
    if( $month == 2 ){
      $num_days = 29;
      $num_days = 28 if     $year % 4;
      $num_days = 28 unless $year % 100;
      $num_days = 29 unless $year % 400;
    }
    unless( defined $num_days ){
      print "Invalid month.\n"
    }
    
...