メインコンテンツ

関数パラメーターの数がしきい値を超えている

関数パラメーターの数が、定義済みしきい値を超えている

R2021a 以降

説明

この欠陥は、チェッカーの定義済みしきい値を超える数の引数が含まれる関数に対して報告されます。Polyspace がパラメーターの数を計算する方法について詳しくは、関数パラメーターの数を参照してください。

Polyspace® は、ユーザーがしきい値を指定しない限り、既定のしきい値として 5 を使用します。しきい値を指定できる選択ファイルを指定するには、オプション [ファイルごとにチェッカーを設定] (-checkers-selection-file) または [チェッカー アクティベーション ファイル] (-checkers-activation-file) を使用します。

polyspace-comments-import を使用して以前の解析からコメントをインポートすると、Polyspace は以前の結果のコード メトリクスの関数パラメーターの数に関するレビュー情報を、このチェッカーの現在の結果にコピーします。現在の結果に同じコード メトリクスが含まれている場合、レビュー情報はそのコード メトリクスにもコピーされます。

リスク

このチェッカーに違反した場合は、次のことを意味します。

  • 関数が他の関数と、許容できないほど高い相互依存性を持つ可能性がある。

  • 関数が 1 つの特定のタスクを実行するのではなく、複数のタスクを実行している可能性がある。ベスト プラクティスは、1 つの関数に 1 つの特定のタスクをデリゲートすることです。

  • 関数で不測の、または計画外の状況に発展する可能性がある。

  • レジスタがすべてのパラメーターを保持できないため、関数がパフォーマンスの妨げとなる可能性がある。

これらの要因により、関数の保守とデバッグが困難になります。

修正方法

このチェックを修正するには、コードをリファクタリングするか、チェッカー選択 XML でしきい値を変更します。関数を特定の 1 つのタスクを実行する複数の小さなチャンクに分割し、関数がしきい値として指定された数を超えるパラメーターを取らないようにすることをお勧めします。関数で複数の関連するパラメーターを使用する場合は、それらのパラメーターを構造体にバンドルすることを検討してください。

ベスト プラクティスは、開発後のリファクタリング コストを回避するために、開発の早期段階でモジュールの複雑度をチェックすることです。

すべて展開する


#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 がしきい値として定義されている 5 を超える、6 つのパラメーターを取っています。パラメーターの数が多い場合、これは関数が 1 つの特定のタスクを実行するのではなく、複数のタスクを実行している可能性、および他の関数との相互依存性が高い可能性を示しています。Polyspace は、非準拠としてこの関数にフラグを設定します。

修正 — 各関数が 1 つの特定のタスクを実行するように、コードをリファクタリングする

1 つの修正方法として、コードをリファクタリングして、関数が単一の特定のタスクを行うようにします。このコードでは、関数 CalculateEffectiveIndex が 2 つの小さい関数にリファクタリングされ、各関数が単一の特定のタスクを実行するようになっています。これらの関数が取るパラメーターの数は定義されたしきい値を下回っているため、関数のデバッグおよび保守が容易になります。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 で導入