Number of Calling Functions

Количество отдельных вызывающих абонентов функции

Описание

Эта метрика измеряет количество отдельных вызывающих абонентов функции.

В C++, Polyspace® не вычисляет эту метрику для виртуальных функций и неявных функций, сгенерированных компилятором, таких как конструкторы по умолчанию и деструкторы. Метрика вычисляется для пользовательских конструкторов и деструкторов. В иерархии классов, если базовый класс имеет определяемые пользователем конструкторы, Polyspace подсчитывает эту метрику для соответствующих конструкторов производных классов.

Рекомендуемый верхний предел для этой метрики равен 5. Для получения более автономного кода попробуйте применить верхний предел для этой метрики.

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

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

Обратите внимание, что метрика:

  • Учитывает только прямых вызывающих абонентов.

  • Не рассматривает вызовы через указатель на функцию.

  • Учитывает все вызовы функций, включая таковые в недоступном коде.

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

Примеры

расширить все

#include <stdio.h>


    int getVal() {
    int myVal;
    printf("Enter a value:");
    scanf("%d", &myVal);
    return myVal;
}

int func() {
    int val=getVal();
    if(val<0)
        return 0;
    else
        return val;
}

int func2() {
    int val=getVal();
    while(val<0)
        val=getVal();
    return val;
}

В этом примере количество функций вызова для getVal равен 2. Функции вызова func и func2.

#include <stdio.h>




    int fibonacci(int num)
{
   if ( num == 0 )
      return 0;
   else if ( num == 1 )
      return 1;
   else
      return ( fibonacci(num-1) + fibonacci(num-2) );
}

void main() {
 int count;
 printf("How many numbers ?");
 scanf("%d",&count);
 fibonacci(count);
}

В этом примере количество функций вызова для fibonacci равен 2. Функции вызова main и fibonacci сам.

                #include<iostream>
class A{
    public:
    
	A(){
		std::cout<<"Create A\n";
	}
	~A() = default;
	A(const A&)=default;
	A(A&&) = default;
	virtual void bar(){ std::cout<<"A";}
};
class B: public A{
    public:
	B() = default;
	 void bar() override {std::cout<<"B";}
};

void func(A& a){
	a.bar();
}
int main(){
	A obj;
	A obj2 = obj;
	B objB;
	func(obj);
	return 0;
}

В этом примере:

  • Количество функций вызова для A::A - это два. A::A вызывается один раз, чтобы создать obj и снова, чтобы создать objB. Точно так же количество функций вызова для B:: это единица.

  • Потому что оба A::bar и B::bar являются виртуальными функциями, Polyspace не вычисляет их количество вызывающих функций.

  • Количество функций вызова для func это единица.

Метрическая информация

Группа: Функция
Акроним: CALLING
ЕГО Метрика: Да