Цикломатическая сложность McCabe vs Yourself Drawing

Меня научили вычислять цикломатическую сложность, как это делает сайт. Я нашел эту вещь, которая говорит о цикломатической сложности = (1 + ifs + loops + case). Они одинаковы? То, что я прочитал, идеально подходит для каждого случая? Как мне интересно, упустит ли он что-то или не учтет что-то при расчете? Из того, что я понимаю, это кажется хорошим, но это кажется немного простым по сравнению с рисованием всего.

Также, если у меня есть цикл, например

while (a==b && c>d) {
}

я бы сказал, что там есть 1 цикл (comp = 1 цикл + 1) или я бы сказал, что есть 3 (1 цикл + 1 тест + 1 тест + 1) из-за while a == b и тестовых частей c> d . и как это сравнить с просто

while(a>b) {
}

так как я бы предположил, что у него будет только 1 цикл, поэтому (comp = 1 цикл +1), я бы также предположил, что он будет точно таким же, как цикл FOR с точки зрения сложности.

as

for(int i =0; i<12; i++){
}

у него только одна петля.

Наконец, если у меня есть что-то вроде кода, цикл while без операторов if или чего-либо еще завершает код.

Если бы я нарисовал пути, у меня был бы только один путь, выполняющий code>loop>endcode. Или у меня есть два пути:

1) код>цикл>конечный код

2) code>endcode Представьте, что цикл — это цикл FOR, который я написал выше, например.

Извиняюсь за все вопросы, кажется, в частности, я очень запутался с петлями.


person testuser111    schedule 25.06.2014    source источник


Ответы (1)


Насколько я знаю, анализ пути потока не то же самое, что с использованием ключевых слов, но близок к нему. Я даже нашел оригинал статьи на http://www.literateprogramming.com/mccabe.pdf. сбивает с толку.

Слово «пути» используется двумя способами. Один представляет собой ребро в графе, а другой — набор ребер, также называемый независимым контуром. Я буду использовать термины ребро (единственное ребро) и путь (независимая цепь).

Приложение содержит методику с использованием ключевых слов. Блок-схема примера функции ПОИСК выглядит так, будто имеется 12 ребер — 11 узлов + 2 = 3 пути, но в тексте сказано, что их четыре. Код показывает четыре, что соответствует тексту, но есть только три пути, если учитываются только операторы, которые что-то изменяют.

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

Вопрос о составных условных выражениях (Мейерс) обсуждается здесь http://www.researchgate.net/publication/3407068_A_Critique_of_Cyclomatic_Complexity_as_a_Software /a> в разделе "Теоретические соображения". Составные условные операторы еще более сложны и важны в таких языках, как C или C++, поскольку они имеют ускоренную оценку.
http://en.wikipedia.org/wiki/Short-circuit_evaluation.

Может быть условное выражение, например:

while(a==b && dofunction() {
}

dofunction() будет выполняться только в том случае, если a не равно b.

Что касается вашего последнего вопроса о цикле for, я предполагаю, что есть что-то вроде:

statements (initial)
for(int i =0; i<12; i++)
    {
    statements (body)
    }
statements (end)

Извините, было бы хорошо, если бы я мог нарисовать график, но мне не хватает точек.
Я бы разместил узлы, как:

node(A)
    |
    | statements (initial)
    |
node(B)   (for loop)
    |                 |
    | no statements   |  statements (body)
    |                 |
node(C)   (meet point at end of for loop)
    |
    | statements (end)
    |
node(D)

A-B имеет одно ребро B-C имеет два ребра - одно для взятого условия и одно для пропущенного. C-D имеет одно ребро

Есть только два пути через код. Сложность рассчитывается как: 4 узла - 4 ребра + 2 = цикломатическая сложность 2.

Здесь есть документ, описывающий это, и даже больше примеров систематически анализируются. http://oovaide.sourceforge.net/articles/Complexity.html. В этом документе также показано, что некоторые инструменты учитывают логические операторы, а некоторые нет.

person user3230547    schedule 25.03.2015
comment
Я взял на себя смелость исправить ссылки (как я полагаю, вы их и хотели). плюс 1, и спасибо за ваш замечательный вклад! - person GitaarLAB; 07.10.2015
comment
oovaide.sourceforge.net/articles/Complexity.html В примере 4 диаграмма CFG и расчет кажется неверным. Прямое ребро от начала до конца кажется ненужным, потому что if и else пути первого условия уже отмечены. - person cobp; 28.01.2016
comment
Извините, что так поздно, но большое спасибо, действительно помогли мне прояснить ситуацию! - person testuser111; 05.01.2018