Не так давно некоторые из моих товарищей по команде обнаружили конструкцию switch(true) при чтении кода проекта с открытым исходным кодом. Некоторые из них являются опытными программистами, и если они не знали, другие люди также могут не знать. Кажется справедливым поделиться этим знанием с более широкой аудиторией.
Вы, наверное, знаете, что оператор switch позволяет сопоставить выражение (switch) с разными значениями (case), поэтому использование switch(true) может показаться абсурдным:
Что ж, это неправда. Вы можете сравнивать как значения, так и выражения. Выражения будут оцениваться перед сопоставлением, поэтому будет сопоставлено любое выражение, равное true.
Покажи мне это волшебство!
Рассмотрим следующий пример: вы хотите создать функцию, которая по заданной дате возвращает часы работы какого-либо магазина. Вы можете закодировать это, используя надежную конструкцию if/else, или вы можете использовать предложение switch для сопоставления выражения с несколькими значениями, используя совпадения с несколькими регистрами:
Здесь ничего нового. Давайте попробуем это с помощью switch(true):
Неплохо. Может быть, теперь код более раскрывает намерения, а может, и нет. Я думаю, это зависит от обстоятельств. Попробуем больше раскрывать намерения. Нет ничего более раскрывающего намерение, чем хорошо названные функции.
Так-то лучше! Мне нравится, как он читается, и мои функции выявления намерений можно использовать повторно.
Обратите внимание, что совпадение с true не обязательно. Этот материал работает с любым значением до тех пор, пока ваши выражения case соответствуют этому. Однако я не могу придумать ни одного примера, где вам может понадобиться использовать другое значение.
Стоит ли использовать это?
Это зависит. Вы всегда можете использовать другую конструкцию, и, как я сказал в начале этой истории, возможно, не все в команде знакомы с switch(true).
Я использую эту конструкцию, если она делает код более читабельным. Например, я недавно использовал его в пользовательском картографе для JSON.stringify:
Это хорошая техника. Он не такой мощный, как Ruby case (это было бы здорово), но вы можете найти его полезным для обработки некоторой логики ветвления.
Как я сказал ранее, вы также можете реализовать это с помощью нескольких операторов if. В конце концов, это будет зависеть от вкуса вашей команды и правил кода. Просто согласитесь, использовать switch(true) или нет, и продолжайте.