Когда уместно использовать сквозной (классический) оператор switch? Рекомендуется и поощряется ли такое использование или его следует избегать любой ценой?
switch-statement
shabunc
источник
источник
Ответы:
Вот пример, где это было бы полезно.
Я думаю, что такого рода вещи (где один случай включает другой) довольно редки, поэтому некоторые новые языки либо не допускают фолловера, либо требуют специального синтаксиса для этого.
источник
// INTENTIONAL FALL THROUGH HERE
комментария с заглавными буквами.GetItemsForLevel(Info)
вызовGetItemsForLevel(Warning)
и так далее.Я использую их, когда определенные функции должны применяться для более чем одного значения. Например, допустим, у вас есть объект со свойством с именем operationCode. Если код равен 1, 2, 3 или 4, вы хотите запуститьOperationX (). Если это 5 или 6, вы хотите запуститьOperationY () и 7 вы запускаете OperationZ (). Зачем иметь 7 полных случаев с функциональностью и пробелами, когда вы можете использовать провалы?
Я думаю, что это вполне допустимо в определенных ситуациях, особенно если оно избегает 100 операторов if-else. знак равно
источник
switch
несколькоcase
объектов, привязанных к одному и тому же коду. Это отличается от провала, когда выполнение одногоcase
продолжается в следующем из-за отсутствияbreak
между ними.Я использовал их время от времени, я думаю, что это всегда уместное использование - но только когда включено с соответствующим комментарием.
источник
Проходные случаи прекрасно. Я часто нахожу, что перечисление используется во многих местах, и что, когда вам не нужно различать некоторые случаи, легче использовать сквозную логику.
Например (обратите внимание на пояснительные комментарии):
Я считаю этот вид использования вполне приемлемым.
источник
case X: case Y: doSomething()
и есть большая разницаcase X: doSomething(); case Y: doAnotherThing()
. В первом случае намерение является довольно явным, а во втором - провал может быть намеренным или нет. По моему опыту, первый пример никогда не вызывает никаких предупреждений в компиляторах / анализаторах кода, в то время как второй делает. Лично я бы назвал второй пример «провалившимся», хотя и не уверен насчет «официального» определения.Это зависит от:
Две основные проблемы, связанные с переходом одного дела на другое:
Это делает ваш код зависимым от порядка операторов case. Это не тот случай, если вы никогда не провалитесь, и это добавляет некоторую сложность, которая часто нежелательна.
Не очевидно, что код для одного случая включает в себя код для одного или нескольких последующих случаев.
Некоторые места явно запрещают проваливаться. Если вы не работаете в таком месте, и если вы чувствуете себя комфортно с практикой, и если нарушение кода, о котором идет речь, не принесет никаких реальных страданий, то это может быть не самым худшим в мире. Если вы делаете это, тем не менее, не забудьте разместить привлекающий внимание комментарий, чтобы предупредить тех, кто придет позже (включая будущее вас).
источник
Вот быстрый (по общему признанию, неполный (без специальной обработки високосного года)) пример провала, делающего мою жизнь проще:
источник
Если я чувствую необходимость перейти от одного случая к другому (редко, по общему признанию), я предпочитаю быть очень явным и
goto case
, конечно, это предполагает, что ваш язык поддерживает это.Поскольку падение происходит так редко, и его очень легко не заметить при чтении кода, я чувствую, что уместно быть явным - и переход, даже если это так, должен выделяться, как больной большой палец.
Это также помогает избежать ошибок, которые могут возникнуть при изменении порядка дел.
источник