Cyclomatic Complexity

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

Описание

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

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

Для обеспечения пределов на метрики смотрите Compute Code Complexity Metrics.

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

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

  • Система координат 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
ЕГО Метрика: Да