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). Также смотрите Сложность Reduce Software при помощи Средств проверки Polyspace.

Когда вы импортируете комментарии из предыдущих исследований при помощи polyspace-comments-import, Polyspace копирует любую информацию об анализе о метрике кода 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