Что такое цикломатическая сложность?
термин, который я вижу время от времени, - "цикломатическая сложность". Здесь я увидел некоторые вопросы о том," как вычислить CC языка X "или" Как сделать Y с минимальным количеством CC", но я не уверен, что действительно понимаю, что это такое.
на Веб-Сайт NDepend, Я видел объяснение, которое в основном говорит " количество решений в методе. Каждое если, для, & & etc. добавляет +1 к CC "score"). Это действительно так? Если да, то почему это плохо? Я вижу, что можно было бы сохранить количество операторов if довольно низким, чтобы код был легко понять, но действительно ли это все?
или есть какая-то более глубокая концепция?
14 ответов
Я не знаю более глубокое понятие. Я считаю, что это обычно рассматривается в контексте индекса ремонтопригодности. Чем больше ветвей внутри конкретного метода, тем труднее поддерживать ментальную модель работы этого метода (в целом).
методы с более высокой цикломатической сложностью также сложнее получить полное покрытие кода в модульных тестах. (Спасибо Марк W!)
это приносит все другие аспекты ремонтопригодность, конечно. Вероятность ошибок / регрессий / и так далее. Однако основная концепция довольно прямолинейна.
цикломатическая сложность измеряет количество раз, когда вы должны выполнить блок кода с различными параметрами, чтобы выполнить каждый путь через этот блок. Более высокое количество плохо, потому что это увеличивает шансы на логические ошибки, избегающие вашей стратегии тестирования.
Википедия может быть вашим другом на этом:определение сложность cyclomatic
в принципе, вы должны представить свою программу в виде графа, а потом
сложность (...) определяется как:
M = E − N + 2P
здесь
- M = цикломатическая сложность,
- E = количество ребер графика
- N = количество узлов графа
- P = количество подключенные компоненты
CC-это концепция, которая пытается понять, насколько сложна ваша программа и насколько сложно ее протестировать в одном целочисленном числе.
Cyclocmatic complexity = Number of decision points + 1
точками решения могут быть ваши условные операторы, такие как if, if ... else , switch, for loop, while loop и т. д.
следующая диаграмма описывает тип приложения.
цикломатическая сложность лежит 1-10, чтобы считаться нормальной applicatinon
цикломатическая сложность заключается 11 – 20 умеренной приложения
сложность cyclomatic лежит 21 – 50 рискованно применение
цикломатическая сложность лежит более 50 нестабильное приложение
Да, это действительно он. Чем больше путей выполнения кода, тем больше вещей необходимо протестировать и тем выше вероятность ошибки.
еще один интересный момент, который я слышал:
места в вашем коде с самыми большими отступами должны иметь самый высокий CC. Это, как правило, наиболее важные области для обеспечения охвата тестирования, поскольку ожидается, что их будет сложнее читать/поддерживать. Как отмечают другие ответы,это также более сложные области кода для обеспечения покрытия.
вот и все, идея в том, что метод с низким CC имеет меньше вилок, петель и т. д., которые делают метод более сложным. Представьте себе обзор 500 000 строк кода, с анализатором и видя пару методов, которые имеют Одер величины выше CC. Это позволяет вам сосредоточиться на рефакторинге этих методов для лучшего понимания (также распространено, что высокий CC имеет высокую частоту ошибок)
цикломатическая сложность действительно просто страшное модное слово. На самом деле это мера сложности кода, используемая при разработке программного обеспечения, чтобы указать более сложные части кода (более вероятно, что они будут глючить, и поэтому должны быть очень тщательно и тщательно протестированы). Вы можете рассчитать его с помощью Формулы E-N+2P, но я бы предложил вам автоматически рассчитать это с помощью плагина. Я слышал о эмпирическом правиле, что вы должны стремиться держать CC ниже 5, чтобы поддерживать хорошую читаемость и сопровождаемость кода.
Я недавно экспериментировал с Eclipse Metrics Плагин на моих проектах Java, и у него есть действительно хороший и краткий файл справки, который, конечно, интегрируется с вашей обычной помощью Eclipse, и вы можете прочитать еще несколько определений различных мер сложности и советов и трюков по улучшению вашего кода.
цикломатическая сложность вычисляется с использованием графика потока управления. Количество количественных мер линейно независимых путей через исходный код программы называется цикломатической сложностью (if / if else / for / while )
каждая точка принятия решения в рутине (цикл, переключатель, if и т. д...) по существу сводится к эквиваленту оператора if. Для каждого if
У вас есть 2 codepaths, которые могут быть приняты. Таким образом, в 1-й ветви есть 2 пути кода, во второй-4 возможных пути, в 3-й-8 и так далее. Существует не менее 2**n путей кода, где N - количество ветвей.
Это затрудняет понимание поведения кода и его тестирование, когда N выходит за рамки некоторых небольшое число.
Цикломатрическая сложность в основном является метрикой, чтобы выяснить области кода, которые нуждаются в большем внимании для ремонтопригодности. Это будет в основном вклад в рефакторинг. Это определенно дает указание на область улучшения кода с точки зрения избежания глубокого вложенного цикла, условий и т. д.
вроде того. Однако каждая ветвь оператора" case "или" switch " имеет тенденцию считаться как 1. По сути, это означает CC ненавидит операторы case и любой код, который требует их (командные процессоры, государственные машины и т. д.).
в представленных до сих пор ответах не упоминается корреляция качества программного обеспечения с цикломатической сложностью. Исследования показали, что более низкая метрика цикломатической сложности должна помочь в разработке программного обеспечения более высокого качества. Он может помочь с атрибутами качества программного обеспечения читабельность, сопровождаемость и мобильность. В общем случае следует попытаться получить метрику цикломатической сложности между 5-10.
одна из причин использования метрик, таких как cyclomatic сложность заключается в том, что в целом человек может одновременно отслеживать только около 7 (плюс-минус 2) частей информации в вашем мозгу. Поэтому, если ваше программное обеспечение слишком сложно с несколькими путями принятия решений, маловероятно, что вы сможете визуализировать, как будет вести себя ваше программное обеспечение (т. е. оно будет иметь высокую метрику цикломатической сложности). Это, скорее всего, приведет к разработке ошибочных или ошибок программного обеспечения. Более подробную информацию об этом можно найти здесь а также на Википедия.
рассмотрим график потока управления вашей функции, с дополнительным краем, идущим от выхода к входу. Цикломатическая сложность-это максимальное количество разрезов, которые мы можем сделать, не разделяя график на две части.
например:
function F:
if condition1:
...
else:
...
if condition2:
...
else:
...
вы, вероятно, интуитивно видите, почему связанный граф имеет цикломатическую сложность 3.