Что такое цикломатическая сложность?

Термин, который я вижу время от времени, является "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