exponenta event banner

Число параметров функции превышает пороговое значение

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

Описание

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

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

При импорте комментариев из предыдущих анализов с помощью 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