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

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

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

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

Ответы [ 15 ]

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

Вот и все, идея в том, что метод с низким CC имеет меньше разветвлений, циклов и т. Д., Что делает метод более сложным. Представьте, что вы просматриваете 500 000 строк кода с помощью анализатора и видите пару методов, которые имеют на порядок более высокий уровень CC. Это позволяет вам затем сосредоточиться на рефакторинге этих методов для лучшего понимания (также часто бывает, что высокий CC имеет высокую частоту ошибок)

1 голос
/ 26 мая 2009

Вот так. Однако каждая ветвь оператора "case" или "switch" имеет тенденцию считаться как 1. По сути, это означает, что CC ненавидит операторы case и любой код, который требует их (процессоры команд, конечные автоматы и т. Д.). ).

1 голос
/ 26 мая 2009

Цикломатрическая сложность - это, в основном, показатель для определения областей кода, которые требуют большего внимания для удобства сопровождения. Это будет в основном вклад в рефакторинг. Это определенно указывает на область улучшения кода с точки зрения избежания глубокого вложенного цикла, условий и т. Д.

1 голос
/ 26 мая 2009

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

Например:

function F:
    if condition1:
       ...
    else:
       ...
    if condition2:
       ...
    else:
       ...

Control Flow Graph

График потока управления

Вероятно, вы можете интуитивно понять, почему связанный граф имеет цикломатическую сложность 3.

0 голосов
/ 22 мая 2019

Цикломатрическая сложность - это мера того, насколько сложна единица программного обеспечения. Она измеряет количество различных путей, по которым программа может следовать с условными логическими конструкциями (если, 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

...