Почему использование переключатель statment, вместо если еще statments?

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

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

9
задан Ciro Santilli 新疆改造中心法轮功六四事件 24 June 2015 в 13:52
поделиться

18 ответов

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

  • Компилятор может быть в состоянии оптимизировать для Выключите лучше.
  • Заявление выключателя более четко выражает логику кода лучше. В частности, идея, что вы принимаете другую ветку в зависимости от ценности чего-то, а не в зависимости от более сложной логики. Это, безусловно, тем более важной причиной для меня.
25
ответ дан 4 December 2019 в 05:50
поделиться

Другой способ добавления нового поля - это сделать это во время публикации формы

page = agent.post( url, {'auth_username'=>'myusername',   #existing field
                         'auth_password'=>'mypassword',   #existing field
                         'auth_login'=>'Login'})   #new field
-121--3126681-

В паре с тем, кто специализируется на дизайне пользовательского интерфейса.

Если вы лучше работаете с бизнес-логикой, ваше время лучше потратить исключительно на кодирование бизнес-логики, чтобы вы могли овладеть ею. Это потребует от вас научиться взаимодействовать с кем-то еще, кто превосходит на презентации. ( xml и json являются общими средствами)

Бизнес-логика и представление очень различны. Спроектировать систему, которая не только выглядит хорошо, но и интуитивно понятна и проста в использовании, довольно сложно. Столь же трудным и трудоемким, как и установление внутренней работы сложного приложения.

Хороший интерфейс не так прост, как включение css рамки.

Я считаю себя более «креативным» программистом, который преуспевает в представлении. Мне посчастливилось пересечь путь с тем, кто был, во-первых... очень мотивирован, и, во-вторых, очень хорош в «бизнес-логике». У него было гораздо больше опыта планирования и внедрения сложных систем, в то время как я в основном сосредоточился на дизайне интерфейсов.

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

Задача состоит в том, чтобы найти того, с кем вы хорошо работаете.

-121--774237-

Не задавайте программисту python этот вопрос, поскольку язык не содержит инструкции switch и поощряйте использование словарей.

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

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

0
ответ дан 4 December 2019 в 05:50
поделиться

В большинстве случаев я предпочитаю использовать карту, а не коммутатор.

if (actionMap.contains(choice)) {
  Action a = actionMap.get(choice);
  a.execute();
} else {
  //do something else
}

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

switch (choice) {
  case 1: actionOne(); break;
  case 2: if(actionOne()) {actionTwo()}; break; 
  case 3: if(!actionOne() && (actionTwo() > 1)) {actionThree()}; result = 7;break; 
  default: result = actionTwo();
}

К сожалению, иногда требования сложны. Переключатель полезен в тех случаях, когда речь идет об упрощенной версии вложенных if/else constrcts.

0
ответ дан 4 December 2019 в 05:50
поделиться

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

1
ответ дан 4 December 2019 в 05:50
поделиться

Устройство Даффа. Его полезность в наше время спорна, но его крутость - нет.

2
ответ дан 4 December 2019 в 05:50
поделиться

Хорошо, вы можете удалить разрывы из оператора switch. Таким образом вы можете получить это:

CASE_A:
...
BASE_B
...

так, чтобы вы можно сделать так, чтобы case_a объединяла все остальные случаи, расположенные ниже, до тех пор, пока не достигнет разрыва. Не так приятно делать это с помощью «если».

2
ответ дан 4 December 2019 в 05:50
поделиться

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

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

  • Использование при / , когда :

     использовать функцию qw'switch '; 
    мои $ num_days; 
    задано ($ month) { 
    когда ([1,3,5,7,8,10,12]) {$ num_days = 31} 
    когда ([4,6,9,11]) {$ num_days = 30} 
    когда (2) {
     $ num_days = 29; 
     $ num_days = 28, если $ year% 4; 
     $ num_days = 28, если $ year% 100; 
     $ num_days = 29, если не $ year% 400; 
    по умолчанию {print "Недействительный месяц. \ N"} 
    } 
     
  • Использование для в качестве замены для нового оператора ~~ (smart-match) .

     мои $ num_days; 
    для (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) {{{1 }} $ num_days = 29; 
     $ num_days = 28, если $ year% 4; 
     $ num_days = 28, если $ year% 100; 
     $ num_days = 29, если $ year% 400; 
    } 
    , если (определено $ num_days) {
    print "Недействительный месяц. \ N" 
    } 
     
2
ответ дан 4 December 2019 в 05:50
поделиться

Можно ли поместить все файлы в один каталог?

Если да, то почему бы просто не позвонить в Directory.Delete(string, bool) на удаляемом вложенном каталоге?

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

С наилучшими пожеланиями, Флориэн

-121--2410567-

Включено ли состояние просмотра в GridView? Это застало меня много раз.

-121--3677713-

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

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

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

2
ответ дан 4 December 2019 в 05:50
поделиться

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

-121--3204856-

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

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

-121--3204854-

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

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

2
ответ дан 4 December 2019 в 05:50
поделиться

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

3
ответ дан 4 December 2019 в 05:50
поделиться

можно удалить разрывы из инструкции switch. Это путь, что вы можете иметь:

CASE _ A:
...
BASE_B
...

Таким образом, вы можете case_a объединить все остальные случаи под ним, пока он не попадет на перерыв. Не так приятно делать это с помощью только IFS.

-121--3204850-

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

Коммутаторы позволяют проще вставлять новый корпус.

-121--3204863-

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

7
ответ дан 4 December 2019 в 05:50
поделиться

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

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

4
ответ дан 4 December 2019 в 05:50
поделиться

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

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

    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;
    }
27
ответ дан 4 December 2019 в 05:50
поделиться

Это может быть проще для компилятора превратить оператор ключа в диспетчерскую таблицу, чем превращать эквивалент if/else soup в диспетчерскую таблицу. Если (и только если) это так, то вместо O(log n) (или O(n), если суп if/else написан плохо) следует использовать диспетчерскую O(1) в соответствующем коде.

В некоторых (хотя и не во всех) случаях может быть также проще проверить, что вы выполнили необходимые тесты с помощью switch, чем с помощью wodge if/else.

0
ответ дан 4 December 2019 в 05:50
поделиться

Пара замечаний:

  1. Некоторые языки позволяют включать другие типы значений, такие как строка (пример Coldfusion)
  2. Оператор switch может быть намного более простым для чтения кодом, чем большой блок операторов if / elseif / else
  3. В операторах switch вы можете прервать конец кейса или разрешить коду продолжить обработку дальнейших кейсов в операторе. Эта функциональность позволяет вам легко моделировать некоторые правила, которые операторы if / elseif / else не позволят вам сделать так легко.
  4. Как отмечали другие, имейте в виду, что компиляторы и движки имеют оптимизаторы, а операторы переключения оптимизируются по-разному.
2
ответ дан 4 December 2019 в 05:50
поделиться

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

Также, в зависимости от выбранного языка, можно использовать случай попадания в "особенность", когда, как и в случае с цепочкой if-elseif, вы получите дублированный код.

4
ответ дан 4 December 2019 в 05:50
поделиться

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

9
ответ дан 4 December 2019 в 05:50
поделиться

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

Переключатели упрощают установку нового корпуса.

18
ответ дан 4 December 2019 в 05:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: