Что такое цикломатическая сложность?
Термин, который я вижу время от времени, является "Cyclomatic Complexity". Здесь на SO я увидел некоторые вопросы о том, "как вычислить CC языка X" или "Как сделать Y с минимальным количеством CC", но я не уверен, что действительно понимаю, что это такое.
На NDepend Website я увидел объяснение, в котором в основном говорится: "Количество решений в методе. Каждый, если, для, && и т.д. добавляет +1 к CC" score"). Действительно ли это? Если да, то почему это плохо? Я вижу, что можно захотеть сохранить количество if-операторов довольно низким, чтобы упростить код чтобы понять, но действительно ли это для этого?
Или есть более глубокое понятие?
Ответы
Ответ 1
Я не знаю более глубокой концепции. Я считаю, что это обычно рассматривается в контексте индекса ремонтопригодности. Чем больше ветвей существует в рамках определенного метода, тем сложнее поддерживать ментальную модель операции этого метода (в целом).
Методы с более высокой циклической сложностью также сложнее получить полное покрытие кода в модульных тестах. (Спасибо Mark W!)
Это, конечно, привносит все остальные аспекты ремонтопригодности. Вероятность ошибок/регрессий/и т.д. Основная концепция довольно проста, однако.
Ответ 2
Цикломатическая сложность измеряет количество раз, когда вы должны выполнить блок кода с различными параметрами, чтобы выполнять каждый путь через этот блок. Более высокий показатель является плохим, потому что он увеличивает шансы на то, что логические ошибки ускоряют вашу стратегию тестирования.
Ответ 3
Cyclocmatic complexity = Number of decision points + 1
Точками принятия решения могут быть ваши условные операторы, такие как if, if... else, switch, for loop, while loop и т.д.
В следующей таблице описывается тип приложения.
-
Цикломатическая сложность лежит 1 - 10 Рассматривается Нормальная
applicatinon
-
Cyclomatic Complexity лежит 11 - 20 Умеренное применение
-
Cyclomatic Complexity лежит 21 - 50 Рискованное приложение
-
Цикломатическая сложность составляет более 50 Нестабильное приложение
Ответ 4
Википедия может быть вашим другом по этому вопросу: определение цикломатической сложности
По сути, вы должны представить свою программу в виде графика потока управления, а затем
Сложность (...) определяется как:
M = E − N + 2P
где
- М = цикломатическая сложность,
- E = количество ребер графа
- N = количество узлов графа
- P = количество подключенных компонентов
CC - это концепция, которая пытается понять, насколько сложна ваша программа и насколько сложно ее протестировать одним целым числом.
Ответ 5
Да, это действительно так. Чем больше путей выполнения вашего кода может принять, тем больше вещей, которые необходимо протестировать, и большей вероятности ошибки.
Ответ 6
Еще один интересный момент, который я слышал:
Места в вашем коде с самыми большими отступами должны иметь самый высокий CC. Как правило, это самые важные области для обеспечения охвата тестированием, поскольку ожидается, что их будет сложнее читать/поддерживать. Как отмечают другие ответы, это также более сложные регионы кода для обеспечения покрытия.
Ответ 7
Cyclomatic Complexity действительно просто страшное модное слово. На самом деле это мера сложности кода, используемая в разработке программного обеспечения, чтобы указать более сложные части кода (скорее всего, это ошибка, и поэтому ее нужно тщательно и тщательно протестировать). Вы можете рассчитать его, используя формулу E-N + 2P, но я бы предположил, что вы рассчитали это автоматически плагином. Я слышал об эмпирическом правиле, что вы должны стремиться держать CC ниже 5 для обеспечения хорошей читаемости и ремонтопригодности вашего кода.
Недавно я экспериментировал с Eclipse Metrics Plugin в моих проектах Java, и у него есть очень хороший и сжатый файл справки, который будет конечно, интегрируйтесь со своей обычной справочником Eclipse, и вы можете прочитать еще несколько определений различных мер сложности и советов и рекомендаций по улучшению вашего кода.
Ответ 8
Это то, что идея состоит в том, что метод с низким CC имеет меньше вилок, циклов и т.д., которые все делают метод более сложным. Представьте себе, что вы просмотрите 500 000 строк кода с помощью анализатора и увидите несколько методов, которые имеют более высокий CC. Это позволяет затем сосредоточиться на реорганизации этих методов для лучшего понимания (также часто бывает, что высокий CC имеет высокую частоту ошибок)
Ответ 9
Каждая точка принятия решения в подпрограмме (loop, switch, if и т.д.) по существу сводится к эквиваленту if. Для каждого if
у вас есть 2 кодировки, которые можно взять. Итак, с 1-й ветвью есть 2 кодовых пути, со вторым - 4 возможных пути, с 3-м - 8 и так далее. Существует, по крайней мере, 2 ** N кодовых пути, где N - количество ветвей.
Это затрудняет понимание поведения кода и его проверку, когда N растет за небольшим числом.
Ответ 10
В представленных ответах пока не упоминается корреляция качества программного обеспечения с циклической сложностью. Исследования показали, что использование более низкой циклометрической метрики сложности должно помочь в разработке программного обеспечения с более высоким качеством. Он может помочь с атрибутами качества программного обеспечения, читабельностью, ремонтопригодностью и переносимостью. В общем случае следует попытаться получить метрику циклической сложности между 5-10.
Одной из причин использования таких показателей, как циклическая сложность, является то, что в целом человек может отслеживать только около 7 (плюс или минус 2) информации одновременно в вашем мозгу. Поэтому, если ваше программное обеспечение слишком сложно с несколькими путями решений, маловероятно, что вы сможете визуализировать, как будет работать ваше программное обеспечение (т.е. Оно будет иметь высокую циклометрическую метрику сложности). Это, скорее всего, приведет к разработке ошибочного или исправленного программного обеспечения. Более подробную информацию об этом можно найти здесь, а также на Wikipedia.
Ответ 11
Цикломатическая сложность вычисляется с использованием графика потока управления. Число количественной меры линейно независимых путей через программный исходный код называется Cyclomatic Complexity (если/if else/for/while)
Ответ 12
Рассмотрим контрольный потоковый график вашей функции с дополнительным краем, идущим от выхода до входа. Цикломатическая сложность - это максимальное количество разрезов, которые мы можем сделать, не разделяя граф на две части.
Например:
function F:
if condition1:
...
else:
...
if condition2:
...
else:
...
![Control Flow Graph]()
График потока управления
Возможно, вы можете интуитивно понять, почему связанный граф имеет цикломатическую сложность 3.
Ответ 13
Cyclomatric complex - это, в основном, метрика для определения областей кода, которые нуждаются в большей доступности для ремонтопригодности. Это будет основной вклад в рефакторинг.
Он определенно дает представление о области улучшения кода с точки зрения предотвращения глубокого вложенного цикла, условий и т.д.
Ответ 14
Такого рода. Однако каждая ветвь оператора "case" или "switch" имеет тенденцию считать 1. Фактически это означает, что CC ненавидит операторы case и любой требующий их код (командные процессоры, конечные машины и т.д.).
Ответ 15
Цикломатрическая сложность - это мера того, насколько сложна единица программного обеспечения. Она измеряет количество различных путей, по которым программа может следовать с условными логическими конструкциями (если, while, for, switch & case и т. Д....). Если вы хотите узнать больше о его расчете, вот отличное видео на YouTube, которое вы можете посмотреть https://www.youtube.com/watch?v=PlCGomvu-NM
Это важно при разработке тестовых случаев, поскольку в нем раскрываются различные пути или сценарии, которые может использовать программа. "Чтобы иметь хорошую тестируемость и ремонтопригодность, McCabe рекомендует, чтобы ни один программный модуль не превышал цикломатическую сложность 10" (Marsic, 2012, p. 232).
Ссылка: Marsic., I. (2012, сентябрь). Программная инженерия. Университет Рутгерса. Получено с www.ece.rutgers.edu/~marsic/books/SE/book-SE_marsic.pdf