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

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

Описание

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

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

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