Цикломатическая сложность

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

Описание

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

Рекомендуемый верхний предел для этой метрики равняется 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: да

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