Цикломатическая полнота IF ELSE против SWITCH CASE

Многие инструменты анализа кода, такие как сонар, выдают ошибки для случая переключения, если они используются вместо нескольких is-else для цикломатической сложности. Есть ли число, которое должно быть порогом того, когда следует использовать if else и когда следует использовать case case? Скажем, если это случай 50, чтобы уменьшить цикломатическую сложность, следует использовать случай переключения? Было бы хорошо, если бы вы могли подтвердить свой ответ примером?


person sRiRaJ mISHrA    schedule 21.10.2015    source источник
comment
Если есть 50 возможных ветвей для ввода, код требует жесткого рефакторинга.   -  person John    schedule 21.10.2015
comment
Это может быть 50 случаев сопоставления, а затем установка определенного значения?   -  person sRiRaJ mISHrA    schedule 21.10.2015
comment
Этого не должно быть. Скорее всего, какое-то дизайнерское решение пошло не так. Но если на самом деле существует так много возможных ветвей, используйте детерминированный автомат, и значение будет рассчитываться с CC = 1. Или, я думаю, какая-то структура значения ключ-значение, как и все, что реализует интерфейс Map.   -  person John    schedule 21.10.2015
comment
Это имеет смысл, но есть ли число, которое говорит, когда мы должны использовать переключатель, а когда - если еще?   -  person sRiRaJ mISHrA    schedule 21.10.2015


Ответы (1)


Чтобы ответить на вопрос другим вопросом.

Вы бы предпочли прочитать:

if(cond1)..

else if(cond2)...

else if(cond50)...

else ...

or

value = map.get(key)

Если существует так много возможных случаев, то ни один переключатель или не кажется подходящим, и поэтому его следует заменить на key-value structure или state machine pattern - если ветвление действительно сложное.

Вы можете найти пример реализации здесь:

фсм

Что касается того, когда использовать if или switch, имейте в виду, что switch не может принимать следующие типы:

long, double, float, boolean, поэтому, когда у вас есть такой вход, переключатель, очевидно, не является выбором.

Я бы не стал использовать число в качестве метрики для использования switch или if statement. Однако есть одно исключение: если вход может иметь только 2 возможных значения, лучше использовать if. Даже Сонар должен предложить вам это.

Тем не менее, switch обычно более удобочитаем, чем последовательность операторов if. В качестве важного фактора принятия решения, помимо удобочитаемости, в операторе switch могут быть группы значений, для которых может потребоваться один и тот же путь выполнения. Это в основном более безопасная версия goto. В отличие от if, где каждый результат обычно привязан к определенному пути выполнения.

person John    schedule 21.10.2015