Что такое цикломатическая сложность? - PullRequest
68 голосов
/ 26 мая 2009

Термин, который я вижу время от времени, - «Цикломатическая сложность». Здесь, на SO, я видел несколько Вопросов о том, «как рассчитать CC языка X» или «Как мне сделать Y с минимальным количеством CC», но я не уверен, что я действительно понимаю, что это такое.

На веб-сайте NDepend я увидел объяснение, которое в основном гласит: «Число решений в методе. Каждое из них, если, для, && и т. Д., Добавляет +1 к" счету "CC) что на самом деле? Если да, то почему это плохо? Я вижу, что можно хотеть, чтобы число операторов if было достаточно низким, чтобы облегчить понимание кода, но действительно ли это все?

Или в этом есть более глубокая концепция?

Ответы [ 15 ]

52 голосов
/ 26 мая 2009

Мне не известна более глубокая концепция. Я считаю, что это обычно рассматривается в контексте индекса ремонтопригодности. Чем больше веток в конкретном методе, тем сложнее поддерживать ментальную модель работы этого метода (как правило).

Методы с более высокой цикломатической сложностью также сложнее получить полное покрытие кода в модульных тестах. (Спасибо Марк W !)

Это, конечно, влечет за собой все другие аспекты ремонтопригодности. Вероятность ошибок / регрессий / пр. Однако основная концепция довольно проста.

36 голосов
/ 26 мая 2009

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

12 голосов
/ 03 июля 2013
Cyclocmatic complexity = Number of decision points + 1

Решающими точками могут быть ваши условные утверждения, например, если, если ... еще, переключение, цикл, цикл и т. Д.

Следующая таблица описывает тип приложения.

  • Цикломатическая сложность лежит 1 - 10  Считается нормальным applicatinon

  • Цикломатическая сложность лежит 11 - 20  Умеренное применение

  • Цикломатическая сложность лежит 21 - 50  Рискованное применение

  • Цикломатическая сложность лежит более чем на 50  Нестабильное применение

11 голосов
/ 26 мая 2009

Википедия может быть вашим другом на этом: Определение цикломатической сложности

По сути, вы должны представить свою программу в виде графика управления , а затем

Сложность (...) определяется как:

M = E − N + 2P

, где

  • М = цикломатическая сложность,
  • E = количество ребер графа
  • N = количество узлов графа
  • P = количество подключенных компонентов

CC - это концепция, которая пытается понять, насколько сложна ваша программа и насколько сложно ее протестировать одним целым числом.

7 голосов
/ 26 мая 2009

Да, это действительно так. Чем больше путей выполнения может пройти ваш код, тем больше вещей нужно протестировать и тем выше вероятность ошибки

4 голосов
/ 26 мая 2009

Еще один интересный момент, который я слышал:

Места в вашем коде с самыми большими отступами должны иметь самый высокий CC. Как правило, это наиболее важные области для обеспечения охвата тестирования, поскольку ожидается, что их будет труднее читать / поддерживать. Как отмечают другие ответы, это также более сложные области кода для обеспечения покрытия.

3 голосов
/ 26 мая 2009

Cyclomatic Complexity действительно просто страшное модное слово. Фактически это мера сложности кода, используемая при разработке программного обеспечения, чтобы указать на более сложные части кода (более вероятно, что они будут содержать ошибки, и поэтому должны быть очень тщательно и тщательно протестированы). Вы можете рассчитать его, используя формулу E-N + 2P, но я бы посоветовал вам рассчитать это автоматически с помощью плагина. Я слышал эмпирическое правило, что вы должны стремиться держать CC ниже 5, чтобы поддерживать хорошую читабельность и удобство обслуживания вашего кода.

Я только недавно экспериментировал с Eclipse Metrics Plugin над моими проектами Java, и у него есть действительно хороший и краткий файл справки, который, конечно, будет интегрирован с вашей обычной справкой Eclipse, и вы можете прочитать еще определения различных мер сложности, а также советы и рекомендации по улучшению вашего кода.

2 голосов
/ 04 июня 2017

Цикломатическая сложность вычисляется с использованием графика потока управления. Число количественных показателей линейно независимых путей через исходный код программы называется Cyclomatic Complexity (if / if else / for / while)

2 голосов
/ 10 февраля 2012

В ответах, предоставленных до сих пор, не упоминается соотношение качества программного обеспечения и цикломатической сложности. Исследования показали, что более низкий показатель цикломатической сложности должен помочь в разработке программного обеспечения более высокого качества. Это может помочь с такими качественными качествами программного обеспечения, как удобочитаемость, удобство обслуживания и портативность. В общем случае следует попытаться получить показатель цикломатической сложности от 5 до 10.

Одна из причин использования таких метрик, как цикломатическая сложность, заключается в том, что в целом человек может одновременно отслеживать только около 7 (плюс или минус 2) фрагментов информации в вашем мозгу. Поэтому, если ваше программное обеспечение слишком сложное с несколькими путями принятия решений, маловероятно, что вы сможете визуализировать, как будет вести себя ваше программное обеспечение (т. Е. Оно будет иметь высокий показатель цикломатической сложности). Это, скорее всего, приведет к разработке ошибочного или ошибочного программного обеспечения. Более подробную информацию об этом можно найти здесь , а также в Википедии .

2 голосов
/ 26 мая 2009

Каждая точка принятия решения в подпрограмме (цикл, переключение, если и т. Д.) По существу сводится к эквивалентному оператору if. Для каждого if у вас есть 2 кодовых пути, которые можно использовать. Таким образом, с 1-й ветвью есть 2 кодовых пути, со второй - 4 возможных пути, с 3-й - 8 и так далее. Существует не менее 2 ** N кодовых путей, где N - количество ветвей.

Это затрудняет понимание поведения кода и его тестирование, когда N выходит за пределы небольшого числа.

...