Что такое цикломатическая сложность?
термин, который я вижу время от времени, - это "цикломатическая сложность". Здесь я увидел некоторые вопросы о том, как вычислить CC языка X или" как мне сделать Y с минимальным количеством CC", но я не уверен, что действительно понимаю, что это такое.
на Сайт Вопросом, Что Происходит, Я видел объяснение, которое в основном говорит "количество решений в методе. Каждое если, для, & & etc. добавляет +1 к CC "оценка"). Это действительно так? Если да, то почему это плохо? Я вижу, что можно было бы сохранить количество 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 умеренное применение
цикломатическая сложность лежит 21-50 рискованно применение
цикломатическая сложность лежит более 50 нестабильное приложение
Да, это действительно он. Чем больше путей выполнения может занять ваш код, тем больше вещей необходимо протестировать и тем выше вероятность ошибки.
еще один интересный момент, который я слышал:
места в вашем коде с самыми большими отступами должны иметь самый высокий CC. Это, как правило, наиболее важные области для обеспечения покрытия тестирования, потому что ожидается, что они будут сложнее читать/поддерживать. Как отмечают другие ответы, это также более сложные области кода для обеспечения охвата.
вот и все, идея заключается в том, что метод с низким CC имеет меньше вилок, циклов и т. д., которые делают метод более сложным. Представьте себе, что вы просматриваете 500 000 строк кода с помощью анализатора и видите пару методов, которые имеют Одер на величину выше CC. Это позволяет вам затем сосредоточиться на рефакторинге этих методов для лучшего понимания (также часто бывает, что высокий CC имеет высокую частоту ошибок)
цикломатическая сложность на самом деле просто страшное модное слово. На самом деле это мера сложности кода, используемая при разработке программного обеспечения, чтобы указать на более сложные части кода (более вероятно, что они будут ошибочными, и поэтому должны быть очень тщательно и тщательно протестированы). Вы можете вычислить его с помощью Формулы E-N+2P, но я бы предложил вам автоматически вычислить это с помощью плагина. Я слышал о эмпирическом правиле, что вы должны стремиться сохранить CC ниже 5 для поддержания хорошей читаемости и сопровождаемость кода.
Я только недавно экспериментировал с Плагин Eclipse Metrics на моих проектах Java, и у него есть действительно хороший и краткий файл справки, который, конечно же, интегрируется с вашей обычной помощью Eclipse, и вы можете прочитать еще несколько определений различных мер сложности и советов и трюков по улучшению вашего кода.
цикломатическая сложность вычисляется с использованием графика потока управления. Количество количественных мер линейно независимых путей через исходный код программы называется цикломатической сложностью (если/ если еще / для / пока )
каждая точка принятия решения в подпрограмме (цикл, переключатель, if и т. д...) по существу сводится к эквиваленту оператора if. Для каждого
ifУ вас есть 2 кодовых пути, которые могут быть приняты. Итак, с 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.

Comments