Cyclomatic Complexity

Количество линейно независимых путей в теле функции

Описание

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

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

Для обеспечения пределов на метрики:

Подробные данные расчетов

Для определения точек принятия решений при вычислении метрики используются следующие правила:

  • Система координат if оператор является одной точкой принятия решения.

  • Операторы for и while считайте как одну точку принятия решения, даже когда никакое условие не оценивается, например, в бесконечных циклах.

  • Логические комбинации (&&, ||) не учитывайте как точки принятия решений.

  • case операторы не считаются точками принятия решений, если за ними не следуют break оператор. Для образца этот код имеет цикломатическую сложность двух:

    switch(num) {
    		case 0:
    		case 1:
    		case 2:
    		    break;
    		case 3:
    		case 4:
    	}
    	
  • Расчет выполняется после предварительной обработки:

    • Макросы развернуты.

    • Применяется условная компиляция. Блоки, скрытые директивами предварительной обработки, игнорируются.

Примеры

расширить все

int foo(int x,int y)
{
    int flag;
    if (x <= 0)
        /* Decision point 1*/
        flag = 1;
    else
    {
        if (x < y )
            /* Decision point 2*/
            flag = 1;
        else if (x==y)
            /* Decision point 3*/
            flag = 0;
        else
            flag = -1;
    }
    return flag;
}

В этом примере цикломатическая сложность foo равен 4.

int foo (int x, int y) {
    if((x <0) ||(y < 0))
        /* Decision point 1*/
        return 0;
    else
        return (x > y ? x: y);
        /* Decision point 2*/
}

В этом примере цикломатическая сложность foo 3. The ? оператор является второй точкой принятия решения.

#include <stdio.h>


int foo(int x,int y, int ch)
{
    int val = 0;
    switch(ch) {
    case 1:
        /* Decision point 1*/
        val = x + y;
        break;
    case 2:
        /* Decision point 2*/
        val = x - y;
        break;
    default:
        printf("Invalid choice.");
    }
    return val;
}

В этом примере цикломатическая сложность foo 3.

int foo(int x,int y, int bound)
{
    int count = 0;
    if (x <= y)
        /* Decision point 1*/
        count = 1;
    else
        while(x>y) {
            /* Decision point 2*/
            x--;
            if(count< bound) {
                /* Decision point 3*/
                count++;
            }
        }
    return count;
}

В этом примере цикломатическая сложность foo равен 4.

Метрическая информация

Группа: Функция
Акроним: VG
ЕГО Метрика: Да