В чем разница между цикломатической сложностью и эссенциальной цикломатической сложностью?

Уже был вопрос о том, что такое цикломатическая сложность?

Тем не менее, есть еще один термин - Essential Cyclomatic Complexity.

Каковы различия и сходства между этими двумя метриками кода? Каковы их типичные принятые значения? Кроме того, я узнал, что для понимания кода, Essential Cyclomatic Complexity - более актуальная метрика. Принимая во внимание, что с точки зрения реализации Цикломатическая Сложность является наиболее актуальной. Если это так, то почему?

1 ответ

Решение

Циклометрическая сложность, как вы знаете, эффективно измеряет количество возможных независимых путей через метод или функцию. Это говорит нам, насколько сложен метод для тестирования.

Однако существенная циклометрическая сложность говорит о том, сколько сложности осталось после того, как мы удалили хорошо структурированную сложность. Примером хорошо структурированной сложности является цикл for, где условие для цикла указано в начале цикла. Однако если мы вырвемся из цикла с помощью оператора break, например где-то посередине пути, мы сломаем наш структурированный компонент. Аналогичная ситуация, когда у нас есть несколько операторов возврата в одной функции.

Так что это говорит нам?

Хорошо, представьте, что у нас есть функция с высоким CC: функция, которую сложно протестировать. Теперь, если эта функция имеет низкую существенную CC, это означает, что довольно легко разбить эту функцию на другие меньшие функции, которые легче протестировать индивидуально. Когда существенная сложность высока, этот рефакторинг сложнее, так как сложность сложнее понять.

Таким образом, код, имеющий высокую существенную сложность, означает, что его код сложнее поддерживать и понимать. Мы можем сказать, что этот код более низкого качества. Код, имеющий высокую сложность, сложнее тестировать, но в целом мы можем сделать что-то легче, когда существенная сложность мала.

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

Мои личные ограничения для приложения в стиле enterpise в.NET или Java будут следующими:

CC <= 16 и ECC <= 6

Для более сложных приложений, скажем, в C/C++, я бы предложил более жесткие ограничения:

CC <= 10 и ECC <= 4

Другие вопросы по тегам