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