exponenta event banner

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

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

Описание

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

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