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. ? оператор является вторым моментом принятия решения.

#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
Метрика HIS: да

Смотрите также