Переключатели кажутся столь бесполезными, как они могут быть заменены тем, если еще операторы, которые могут сделать намного больше, чем просто соответствие символ/интервал/перечисление и т.д. Я могу только думать об одном хорошем использовании для переключателя, и это было бы для интерпретации командной строки args.
Каково некоторое реалистическое использование для оператора переключения?
Есть две причины использования переключателя VS, если / иначе, в мой взгляд:
Другой способ добавления нового поля - это сделать это во время публикации формы
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 полезна. Это полезно, когда анализатор языка/компилятора/статики может убедиться, что вы проверяете все случаи. Это хорошо работает с перечислениями.
Если добавить еще один предмет в перечисление, теперь можно получать предупреждения во всех местах, где выполняется включение такого перечисления, указывая на отсутствие обращения.
В большинстве случаев я предпочитаю использовать карту, а не коммутатор.
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.
Это помогает читабельность - с первого взгляда, я знаю, что решение, для которого можно запускать код, основанный на разных значениях одной и той же переменной.
Устройство Даффа. Его полезность в наше время спорна, но его крутость - нет.
Хорошо, вы можете удалить разрывы из оператора switch. Таким образом вы можете получить это:
CASE_A:
...
BASE_B
...
так, чтобы вы можно сделать так, чтобы case_a объединяла все остальные случаи, расположенные ниже, до тех пор, пока не достигнет разрыва. Не так приятно делать это с помощью «если».
В случае 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"
}
Можно ли поместить все файлы в один каталог?
Если да, то почему бы просто не позвонить в Directory.Delete(string, bool)
на удаляемом вложенном каталоге?
Если у вас уже есть список путей к файлам, от которых вы хотите избавиться, вы можете получить лучшие результаты, переместив их в временный каталог, а затем удалив их, а не вручную.
С наилучшими пожеланиями, Флориэн
-121--2410567-Включено ли состояние просмотра в GridView? Это застало меня много раз.
-121--3677713-Мне кажется, что главное преимущество переключателя заключается в том, что он сразу делает для читателя очевидным, что все опции зависят от одной и той же переменной. Вы, конечно, могли бы написать блок if/elseif/elseif, который выполнил то же самое, но тогда читатель должен был бы тщательно проверить, что действительно это одна и та же переменная тестируется каждый раз.
Есть также кошмарный сценарий обслуживания, где у вас есть длинный if/elseif на той же переменной и кто-то решает изменить имя переменной, и поэтому он меняет все if 's... за исключением того, что он пропускает один.
Как отмечали другие, существует также тот факт, что компилятор обычно может оптимизировать его лучше.
Я использую переключатели, когда я использую перечисление, чтобы диктовать, какие действия должен предпринять мой метод. Это помогает, когда действия являются взаимоисключающими.
-121--3204856-Есть несколько ситуаций, с которыми нам приходится иметь дело много, это если у вас есть много вариантов, синтаксис немного более сжатый, и иногда легче читать, чем синтаксис if/then.
Хотя аргумент может быть сделан, чтобы перейти либо путь, я нахожу, что переключатели, в случае нескольких вариантов легче читать, поддерживать и понимать. Я также использовал его в фабричной ситуации с типом образца, которая помогает зарегистрировать.
-121--3204854-Это правильный способ использовать язык. Он позволяет компилятору выполнять некоторые оптимизации и облегчает чтение кода кем-то, кто не является вами.
Кроме того, в некоторых языках вы можете переключить перечисление, и компилятор будет предупреждать, если вы пропустите значения (я думаю).
Операции переключения отлично подходят для записи на машине конечного состояния, Нажмите здесь, чтобы узнать о них подробнее
можно удалить разрывы из инструкции switch. Это путь, что вы можете иметь:
CASE _ A:
...
BASE_B
...
Таким образом, вы можете case_a объединить все остальные случаи под ним, пока он не попадет на перерыв. Не так приятно делать это с помощью только IFS.
-121--3204850-Вы должны помнить, что переключатели легче поддерживать - целая куча вложенных ifs и эльз может быстро стать болью для поддержания.
Коммутаторы позволяют проще вставлять новый корпус.
-121--3204863-Коммутаторы оптимизированы на многих языках для определенных контекстов. Часто по возможности они создают таблицу прыжков или даже хеш-таблицу. На самом деле, когда возможно использовать коммутатор, он, скорее всего, будет работать лучше, чем (логически) тот же код, использующий if/else.
Существует ряд ситуаций, одна из которых, с которой нам приходится иметь дело, - это если у вас много опций, синтаксис немного более сжат, и иногда его легче читать, чем синтаксис if / then.
Хотя можно привести любой аргумент, я считаю, что переключатели в случае нескольких вариантов легче читать, поддерживать и понимать. Я также использовал его в ситуации фабричного типа шаблона, что помогает документировать.
Существует несколько случаев, когда переключатель более читаемый и пригодится. Обычно, когда у вас есть группировка вариантов.
Вот один из них:
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;
}
Это может быть проще для компилятора превратить оператор ключа в диспетчерскую таблицу, чем превращать эквивалент if/else soup в диспетчерскую таблицу. Если (и только если) это так, то вместо O(log n) (или O(n), если суп if/else написан плохо) следует использовать диспетчерскую O(1) в соответствующем коде.
В некоторых (хотя и не во всех) случаях может быть также проще проверить, что вы выполнили необходимые тесты с помощью switch, чем с помощью wodge if/else.
Пара замечаний:
Я всегда использую переключатели, если сравниваю одну и ту же переменную для нескольких значений - переключатель намного быстрее кодирует (и проще в обслуживании), чем длинная цепочка if-elseif. Представьте себе изменение имени переменной, с коммутатором это будет одно редактирование, с цепочкой if-elseif - несколько.
Также, в зависимости от выбранного языка, можно использовать случай попадания в "особенность", когда, как и в случае с цепочкой if-elseif, вы получите дублированный код.
Я использую переключатели, когда использую перечисление, чтобы указать, какие действия должен выполнять мой метод. Это помогает, когда действия исключают друг друга.
Вы должны помнить, что переключатели проще в обслуживании - целая куча вложенных if и elses может быстро стать проблемой.
Переключатели упрощают установку нового корпуса.