программирование 101, выберите VS, если блок - PullRequest
2 голосов
/ 02 июля 2010

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

Ответы [ 5 ]

4 голосов
/ 02 июля 2010

Ответ будет немного отличаться в зависимости от языка.Например, в C и C ++ операторы switch (select) могут превращаться компилятором в довольно эффективные таблицы переходов, отчасти потому, что они более строгие, чем условия операторов if.(Хотя, честно говоря, современные компиляторы чертовски хороши в оптимизации всевозможных вещей.) Это может быть не так для всех языков / компиляторов (мне кажется, что VB6 в основном трактовал Select Case как серию операторов If/ElseIf.)

Читабельность определенно является фактором: использование switch (или Select Case в VB) говорит любому, кто следит за вами, что все ветви ниже ветвятся в общем состоянии, что весьма полезно.

Поддерживаемость (связанная с удобочитаемостью, но отличающаяся от нее) также является фактором.Если вы измените одну вещь, на которую разветвляется switch, все готово;если у вас длинный набор операторов if, легко пропустить один (или несколько) из них.

2 голосов
/ 02 июля 2010

Таким образом, единственное реальное преимущество, которое я могу придумать для использования блока выбора, - это удобочитаемость для человека ..

Не стоит недооценивать это. При программировании удобочитаемость должна быть проблемой № 1 по умолчанию .

2 голосов
/ 02 июля 2010

Блок переключателей в значительной степени требует следующего:

  • у вас есть только один критерий для исследования или несколько критериев, которые не зависят друг от друга
  • у вас есть несколько (т. Е. Более 2 или 3) предопределенных веток
  • вы хотите найти равенство, например "day == Days.Monday"

Если вы хотите проверить более одного зависимого от кода критерия одновременно, если у вас есть только одна ветвь (или, может быть, две маленькие), или если вы хотите искать неравенство (например, «время> 8,00»), оператор if - это путь.

Возможно, первый пункт в моем списке можно обойти, используя различные "изящные" приемы, но, по моему опыту, это сводится к тому, что код запутан и труден для чтения - и как T.J. заявлено, читаемость является фактором при написании поддерживаемого кода.

0 голосов
/ 02 июля 2010

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

if (today is monday) {
     it is moday.
} else if (today is tuesday and it is 8:00pm) {
     it was not monday but it is tuesday and it is 8:00pm.
} else {
     it must be sunday.
}

switch (day) {
     case: Monday
          it is monday

     case: Tuesday
          it is tuesday
}
0 голосов
/ 02 июля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...