оператора switch можно заменить условными конструкциями
Конструкции выбора в языке Java: if…else, switch
Вложенные условные операторы
Когда требуется последовательно перепроверять несколько взаимоисключающих условий, для частей else не открывают отдельного блока (записывают следующий if как простую, а не как составную инструкцию), чтобы получить более компактную запись. Такие конструкции в коде называют else…if.
Рассмотрим сначала вариант записи со вложенными блоками. Для примера рассмотрим следующую задачу.
Мужчина заполняет в военкомате анкету и программа должна в зависимости от указанного им возраста выводить разные подсказки, а именно:
Предположим, что возраст сохранён в переменной n, тогда для вывода подсказки потребуется следующий код:
Обратите внимание на то, что как только одно из условий окажется истинным — все последующие проверки не будут выполняться (т.е. в лучшем случае выполниться только первая проверка). Соответственно, сообщение об ошибке будет выведено тогда и только тогда, когда все проверяемые условия дадут ложный результат.
Более того, для сообщения о непризывном возрасте условие подобрано с учётом того, что заполняющий анкету уже не подошёл ни к одному из вариантов призывного возраста. Конечно, можно было бы использовать вот такое условие:
Но оно было бы избыточным, ведь ранее (за счёт выше стоящих проверок) мы уже убедились, что переменная n не попала в промежуток [18;60). Если бы переменная попадала в промежуток, то вывелось бы сообщение «Вы можете пройти срочную или контрактную службу» или «Вы можете служить только по контракту».
Но для случая, когда проверяется последовательность условий можно (но не необходимо) использовать более компактную запись, где содержание каждого else кроме последнего не оформляется в виде отдельного блока. Тот же фрагмент кода с учётом этой возможности может записываться так:
Оператор множественного выбора
Инструкция множественного выбора switch позволяет выполнять различные части программы в зависимости от того, какое значение будет иметь некоторая целочисленная переменной (её называют «переменной-переключателем», а «switch» с английского переводится как раз как «переключатель»).
Схема инструкции такова:
Рассмотрим все элементы оператора:
Рассмотрим такую ситуацию: в какой-то момент требуется просить у пользователя, надо ли продолжать программу или можно её завершить. Предположим, что ответ пользователя принимается в виде символа, вводимого с клавиатуры и сохраняемого в переменной ans: Д — да, продолжать, Н — нет, остановить.
Тогда получаем примерно такой программный код:
Если мы захотим как-то оповестить пользователя о том, что он ввёл неподходящий символ, то пригодится метка default:
Альтернатива if/else и switch: литералы объектов в JavaScript
Авторизуйтесь
Альтернатива if/else и switch: литералы объектов в JavaScript
Сложные условия в JS всегда были источником лишнего кода. Однако использование литералов объектов в JavaScript может избавить вас от этой проблемы. Давайте разберёмся, как это работает.
Литерал объекта в JavaScript — это список пар ключ-значение, перечисленных через запятую и обёрнутый фигурными скобками.
Допустим у нас есть функция, которая принимает на вход рифмованную фразу на английском сленге кокни и возвращает её значение. Если использовать конструкцию if/else, то код будет выглядеть следующим образом:
Выглядит так себе. Этот код не только плохо читается, но и использует повторяющийся вызов функции toLowerCase().
Чтобы уменьшить количество кода, мы можем использовать дополнительную переменную или конструкцию switch.
Такой код выглядит чище, но это не предел. К тому же, в случае использования более сложных условий, можно случайно пропустить break и спровоцировать баги.
Альтернатива
Мы можем достичь той же функциональности используя объект. Вот пример, который выглядит гораздо аккуратнее:
Мы используем объект, ключи которого выполняют роль условий, а значения — результатов. Затем, с помощью квадратных скобок, мы проверяем наличие нужной строки. Так как полученная строка может быть null или undefined, то мы используем оператор Nullish coalescing (??). Таким образом мы избавляемся от null-значения, но не исключаем случай, что результат может быть равен нулю или false.
Подробнее о способах обработки undefined в JavaScript.
Сложная логика
Для организации более сложных условий вы можете использовать в качестве значений свойств функции.
В этом коде мы выбираем необходимую функцию по ключу, а затем вызываем её с двумя аргументами. Так как мы используем опциональную цепочку, то функция вызовется только, если она существует. В противном случае вернётся дефолтное значение.
Вывод
Каждая условная конструкция имеет свою область применения. Для литералов объектов в JavaScript это длинные списки условий и сложные условия, которые можно реализовать с помощью функций.
Взаимозаменяем ли switch с if в JavaScript?
Оценить 3 комментария
Ситуация, в которой есть смысл сравнивать эти инструкции — проверка на соответствие множеству взаимоисключающих условий.
if else
Обрабатываются все условия методично, друг за другом.
switch
Каждый case — точка входа в блок инструкций.
Если сравнивать быстродействие, то webkit покажет почти одинаковые результаты, в Gecko производительность выше у switch, но не кардинально (на 20-30%), что не принципиально.
А вот логика у этих инструкций разная. Это заметно, если для некоторых значений требуется выполнить одни и те же инструкции. В этом случае написанные подряд case могут быть удобней, чем составная проверка в if. Кроме того, после выполнения входа выполнение инструкций продолжается либо до инструкции break, либо до окончания инструкции switch. И тут у switch появляются дополнительные возможности.
Следует также учесть, что в инструкции switch выполняется проверка с учётом типа (===), что отличает её от if, в которой проверяться может хоть приведённое значение (==), хоть чёрт в ступе. Значения case должны представлять собой примитивы (выражения, в результате выполнения которых подставляются примитивы).
А вот такое возможно только с использованием switch
Эстетическая красота: Switch vs If
Вводная
Немного нюансов
Речь ниже пойдет о сравнении оператора switch и его конкретной реализаций на языке Java и операторами if в виде оппонентов этой конструкции. О том, что у оператора switch имеется туз в рукаве — производительность (за редким исключением), пожалуй, знает каждый и этот момент рассматриваться не будет — так как крыть его нечем. Но все же, что не так?
1. Многословность и громоздкость
Среди причин, отталкивающих меня от использования оператора switch — это многословность и громоздкость самой конструкции, только взгляните — switch, case, break и default, причем опускаю за скобки, что между ними, наверняка, еще встретится return и throw. Не подумайте, что призываю не использовать служебные слова языка java или избегать их большого количества в коде, нет, лишь считаю, что простые вещи не должны быть многословными. Вот небольшой пример того, о чем говорю:
Итого для меня: switch/case/default VS if.
Если спросить, кому какой нравится больше код, то большинство отдаст предпочтение 1ому варианту, в то время как по мне, он — многословный. Речь о рефакторинге кода здесь не идет, все мы знаем, что можно было бы использовать константу типа EnumMap или IdentityHashMap для поиска списка по ключу channel или вообще убрать нужные данные в сам Channel, хотя это решение дискуссионное. Но вернемся.
2. Отступы
Возможно в академических примерах использование оператора swicth — это единственная часть кода, но тот код, с которым приходится сталкиваться, поддерживать — это более сложный, обросший проверками, хаками, где-то просто предметной сложностью код. И лично меня, каждый отступ в таком месте напрягает. Обратимся к ‘живому’ примеру (убрал лишнее, но суть осталась).
Итого для меня: 5 отступов VS 2.
Но опять, кому какой нравится вариант? Большинство отдаст предпочтение getReference1.
Отдельно стоит отметить, что количество отступов еще зависит от выбранного стиля форматирования кода.
3. Проверка на null
Если используется оператор switch со строками или енумами параметр выбора необходимо проверять на null. Вернемся к getTypes примерам.
Итого для меня: лишний код.
Даже если Вы абсолютно уверенны сейчас в том, что null ‘не придет’, это абсолютно не значит, что так будет всегда. Я проанализировал корпоративный багтрэк и нашел этому утверждению подтверждение. Справедливости ради стоит отметить, что структура кода выраженная через if не лишена этой проблемы, зачастую константы для сравнения используются справа, а не слева, например, name.equals(«John»), вместо «John».equals(name). Но в рамках данной статьи, по этому пункту, хотел сказать, что при прочих равных, подход со switch раздувается проверкой на null, при if же проверка не нужна. Добавлю еще, что статические анализаторы кода легко справляются с возможными null-багами.
4. Разношерстность
Очень часто, при длительном сопровождении кода, кодовая база раздувается и можно легко встретить код, похожий на следующий:
Итого для меня: разный стиль.
Раньше был ‘чистенький’ switch, а теперь switch + if. Происходит, как я называю, смешение стилей, часть кода ‘выбора’ выражена через switch, часть через if. Разумеется никто не запрещает использовать if и switch вместе, если это не касается операции выбора/под выбора, как в приведенном примере.
5. Чей break?
При использовании оператора switch, в case блоках может появиться цикл или на оборот, в цикле — switch, со своими прерываниями процесса обработки. Вопрос, чей break, господа?
Итого для меня: читаемость кода понижается.
Если честно, встречались и куда более запутанные примеры кода.
6. Неуместность
В java 7 появилась возможность использовать оператор switch со строками. Когда наша компания перешла на java 7 — это был настоящий Switch-Бум. Может по этому, а может и по другой причине, но во многих проектах встречаются похожие заготовки:
Итого для меня: появляются неуместные конструкции.
7. Гламурный switch под аккомпанемент хардкода
Немного юмора не помешает.
Заключение
Я не призываю Вас отказываться от оператора switch, местами он действительно хорош собой и лапша из if/if-else/else та еще каша. Но черезмерное его использование где ни попадя, может вызывать недовольство у других разработчиков. И я один из них.
Отдельно хотелось отметить, что c точки зрения понимания кода, у меня нет никаких проблем с switch/case — смысл написанного ясен, но вот с точки зрения восприятия эстетической красоты — есть.
И напоследок. Используйте то, что Вам приходится по душе, опуская за скобки навязанные мнения, главное, чтобы Ваш код был простым, рабочим, красивым и надежным. Всего хорошего.
Условные операторы If и Switch
Очень часто нужно, чтобы в зависимости от некоторых условий выполнялись различные действия.
Реализовать все это позволяют условные операторы.
Условные операторы используются для выполнения определенных действий в зависимости от заданных условий.
В JavaScript имеются следующие условные операторы:
Оператор if
Оператор if используется для определения блока JavaScript кода, который будет выполняться, если заданное условие соблюдается (возвращает true).
if (условие) <
блок кода, выполняемый если условие возвращает true
>
Внимание! Ключевое слово if пишется в нижнем регистре. Использование больших букв (If или IF) приведет к ошибке JavaScript.
Сформируем строку приветствия «Добрый день», если время меньше 18:00:
Оператор else
Оператор else является частью и продолжением оператора if и используется для определения блока JavaScript кода, который будет выполняться, если заданное условие не соблюдается (возвращает false).
if (условие) <
блок кода, выполняемый если условие возвращает true
> else <
блок кода, выполняемый если условие возвращает false
>
Если время меньше 18:00, сформируем строку приветствия «Добрый день», в обратном случае сформируем строку приветствия «Добрый вечер»:
Оператор else if
Оператор else if является частью и продолжением оператора if и используется для определения нового условия, если первое условие не соблюдается (возвращает false).
if (условие1) <
блок кода, выполняемый если условие1 возвращает true
> else if (условие2) <
блок кода, выполняемый если условие1 возвращает false, а условие2 true
> else <
блок кода, выполняемый если условие1 и условие2 возвращают false
>
Если время меньше 10:00, сформируем строку приветствия «Доброе утро», если нет, но при это меньше 20:00, сформируем строку приветствия «Добрый день», в обратном случае сформируем строку приветствия «Добрый вечер»:
Оператор switch
Оператор switch используется для выполнения различных действий в зависимости от различных условий.
Оператор switch используется для сравнения одного значения с множеством других и выбора соответствующего блока кода для выполнения.
Вот как это работает:
Пример:
Метод getDay() объекта Date возвращает номер дня недели в диапазоне от 0 до 6. Воскресенье=0, Понедельник=1, Вторник=2 и т. д. Мы используем номер дня недели, чтобы определить его имя:
Ключевое слово break
Когда совпадение найдено, и работа сделана, приходит время прекратить проверку, так как в ней больше нет необходимости. Для этого и существует ключевое слово break.
Когда интерпретатор JavaScript достигает ключевое слово break, он прерывает выполнение блока оператора switch.
Ключевое слово break значительно экономит время выполнения, так как весь код блока оператора switch, расположенный после него, игнорируется.
В последнем блоке case использовать ключевое слова break не нужно. Этот блок прекратит работу оператора switch в любом случае.
Ключевое слово default
Ключевое слово default определяет блок кода, который выполняется в том случае, если ни одно из условий не совпало.
Пример:
Метод getDay() объекта Date возвращает номер дня недели в диапазоне от 0 до 6. Если сегодня ни Воскресенье (0), ни Суббота (6), то возвращается сообщение по умолчанию:
Блок выбора по условию default не обязательно должен быть последним в блоке оператора switch:
Если блок выбора по условию default не последний в операторе switch, то его нужно заканчивать ключевым словом break.
Общие блоки кода
Иногда возникает необходимость по разным условиям использовать один и тот же код.
В следующем примере условие 4 и 5 определяют общий блок кода, а 0 и 6 определяют другой общий блок кода: