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

Вы, наверное, знаете, что оператор switch позволяет сопоставить выражение (switch) с разными значениями (case), поэтому использование switch(true) может показаться абсурдным:

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

Покажи мне это волшебство!

Рассмотрим следующий пример: вы хотите создать функцию, которая по заданной дате возвращает часы работы какого-либо магазина. Вы можете закодировать это, используя надежную конструкцию if/else, или вы можете использовать предложение switch для сопоставления выражения с несколькими значениями, используя совпадения с несколькими регистрами:

Здесь ничего нового. Давайте попробуем это с помощью switch(true):

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

Так-то лучше! Мне нравится, как он читается, и мои функции выявления намерений можно использовать повторно.

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

Стоит ли использовать это?

Это зависит. Вы всегда можете использовать другую конструкцию, и, как я сказал в начале этой истории, возможно, не все в команде знакомы с switch(true).

Я использую эту конструкцию, если она делает код более читабельным. Например, я недавно использовал его в пользовательском картографе для JSON.stringify:

Это хорошая техника. Он не такой мощный, как Ruby case (это было бы здорово), но вы можете найти его полезным для обработки некоторой логики ветвления.

Как я сказал ранее, вы также можете реализовать это с помощью нескольких операторов if. В конце концов, это будет зависеть от вкуса вашей команды и правил кода. Просто согласитесь, использовать switch(true) или нет, и продолжайте.