exponenta event banner

Number of function parameters exceeds threshold

Количество аргументов функции больше заданного порога

Описание

Этот дефект возникает для функции, когда количество ее аргументов больше заданного порога проверки. Для получения дополнительной информации о том, как Polyspace вычисляет количество параметров, смотрите Number of Function ParametersNumber of Function Parameters (Polyspace Bug Finder Access)

Polyspace® использует порог по умолчанию 5, если вы не задаете порог. Чтобы задать файл выбора, в котором можно задать порог, используйте Set checkers by file (-checkers-selection-file). Также см. «Уменьшение сложности программного обеспечения при помощи Polyspace Checkers».

Когда вы импортируете комментарии из предыдущих анализов при помощи polyspace-comments-importPolyspace копирует всю информацию о рассмотрении метрики кода Number of Function ParametersNumber of Function Parameters(Polyspace Bug Finder Access) в предыдущем результате в эту проверку в текущем результате. Если текущий результат содержит ту же метрику кода, информация проверки также копируется в метрику кода.

Риск

Нарушение этой проверки указывает, что:

  • Функция может иметь недопустимо высокую степень зависимости от других функций.

  • Функция может выполнять несколько определенных задач. Лучшая практика состоит в том, чтобы делегировать одну конкретную задачу одной функции.

  • Функция может содержать неожиданную или незапланированную разработку.

  • Функция может препятствовать эффективности, потому что регистры не могут содержать все параметры.

Эти факторы затрудняют поддержание и отладку функции.

Зафиксировать

Чтобы исправить эту проверку, либо измените код, либо измените порог в XML выбора чекера. Можно хотеть разделить функцию на меньшие фрагменты, которые выполняют определенную задачу и не берут больше, чем количество параметров, заданное в качестве порога. Если параметры функций связаны, можно рассмотреть их объединение в структуры.

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

Примеры

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

#include<vector>
#include<complex>
#define PI 3.1416
std::vector<std::complex<double> >CalculateCoefficient(double, double, int); 
double CalculateMfactor(double, double);
std::complex<double> CalculateEffectiveIndex(//Noncompliant
                    double Radius, double Index1, double Index2,
                     double Wavelength, double FillFactor,
                     int Cutoff){
	double RelativeIndex = Index1/Index2;
	double SizeParameter = 2*PI*Radius*Index1/Wavelength;
	std::complex<double> Polarization = 0; 
	std::vector<std::complex<double>> Coefficient= 
          CalculateCoefficient(RelativeIndex,SizeParameter,Cutoff);
		//...
	 for (const auto& z : Coefficient){
		 Polarization += z;
	 }
	 double Multiplier = CalculateMfactor(FillFactor,Radius);
	 std::complex<double> Neff = (1.0 + Multiplier*Polarization)/
                (1.0 - Multiplier*Polarization);
	 return Neff;
}

В этом примере функция CalculateEffectiveIndex принимает шесть параметров, что больше заданного порога пять. Большое количество параметров указывает, что функция может выполнять более одной конкретной задачи, и она может иметь высокую степень зависимостей от других функций. Polyspace помечает функцию как несовместимую.

Коррекция - рефактор Код так, эти функции выполняли одну конкретную задачу

Одной из возможных коррекций является рефакрирование функции так, чтобы она выполняла одну конкретную задачу. В этом коде функция CalculateEffectiveIndex рефакторируют в две меньшие функции, каждая из которых выполняет одну конкретную задачу. Функции легче отлаживать и поддерживать, потому что они берут меньше параметров, чем заданный порог. Polyspace не помечает эти функции.

#include<vector>
#include<complex>
#define PI 3.1416
std::vector<std::complex<double>>CalculateCoefficient(double, double, int); 
double CalculateMfactor(double, double);

std::complex<double> CalculatePolarization(//Compliant
        double Radius, double Index1, double Index2,
        double Wavelength, int Cutoff){
	double RelativeIndex = Index1/Index2;
	double SizeParameter = 2*PI*Radius*Index1/Wavelength;
	std::complex<double> Polarization = 0; 
	std::vector<std::complex<double> > Coefficient= 
              CalculateCoefficient(RelativeIndex,SizeParameter,Cutoff);
		//...
	 for (const auto& z : Coefficient){
		 Polarization += z;
	 }
	 
	 return Polarization;
}

std::complex<double> CalculateEffectiveIndex
      (std::complex<double> Polarization, double Multiplier){//Compliant
	 
	 std::complex<double> Neff = (1.0 + Multiplier*Polarization)/
              (1.0 - Multiplier*Polarization);
	 return Neff;
}

Проверяйте информацию

Группа: Комплексность программного обеспечения
Язык: C | C++
Акроним: SC07
Порог по умолчанию: 5
Введенный в R2021a