知識ベース

ハルステッド複雑度測定

ソフトウェア保守性インデックス

Halsteadの複雑さの尺度は、1977年にMaurice Howard Halsteadによって、ソフトウェア開発の経験科学の確立に関する論文の一部として導入されたソフトウェアメトリックです。 Halsteadは、ソフトウェアのメトリックが異なる言語でのアルゴリズムの実装または表現を反映する必要があるが、特定のプラットフォームでの実行から独立している必要があるという観察を行いました。したがって、これらのメトリックはコードから静的に計算されます。

Halsteadの目標は、ソフトウェアの測定可能なプロパティとそれらの関係を特定することでした。これは、物質の測定可能な特性(気体の体積、質量、圧力など)の識別とそれらの関係(気体の方程式に類似)の識別に似ています。したがって、彼のメトリックは実際には単なる複雑なメトリックではありません。

計算

与えられた問題について、みましょう:

  • η1{\ displaystyle \、\ eta _ {1}} =個別の演算子の数
  • η2{\ displaystyle \、\ eta _ {2}} =個別のオペランドの数
  • N1 {\ displaystyle \、N_ {1}} =演算子の総数
  • N2 {\ displaystyle \、N_ {2}} =オペランドの総数

これらの数値から、いくつかの指標を計算できます。

  • プログラムの語彙:η=η1+η2{\ displaystyle \ eta = \ eta _ {1} + \ eta _ {2} \、}
  • プログラムの長さ:N = N1 + N2 {\ displaystyle N = N_ {1} + N_ {2} \、}
  • 計算された推定プログラム長:N ^ =η1log2⁡η1+η2log2⁡η2{\ displaystyle {\ hat {N}} = \ eta _ {1} \ log _ {2} \ eta _ {1} + \ eta _ {2 } \ log _ {2} \ eta _ {2}}
  • ボリューム:V = N×log2⁡η{\ displaystyle V = N \ times \ log _ {2} \ eta}
  • 難易度:D =η12×N2η2{\ displaystyle D = {\ eta _ {1} \ over 2} \ times {N_ {2} \ over \ eta _ {2}}}
  • 努力:E = D×V {\ displaystyle E = D \ times V}

難易度の尺度は、コードレビューを行う場合など、プログラムの記述または理解の難しさに関連しています。

労力測定は、次の関係を使用して実際のコーディング時間に変換されます。

  • プログラムに必要な時間:T = E18 {\ displaystyle T = {E \ over 18}}秒

Halsteadが提供したバグ(B)は、実装のエラー数の推定値です。

  • 提供されたバグの数:B = E233000 {\ displaystyle B = {E ^ {2 \ over 3} \ over 3000}}、または最近では、B = V3000 {\ displaystyle B = {V \ over 3000}}が受け入れられます。

次のCプログラムを検討してください。

main(){int a、b、c、avg; scanf( "%d%d%d"、&a、&b、&c); avg =(a + b + c)/ 3; printf( "avg =%d"、avg); }

一意の演算子は、main、()、{}、int、scanf、&、=、+、/、printf、 '、' 、;です。

一意のオペランドは、a、b、c、avg、「%d%d%d」、3、「avg =%d」です。

  • η1= 12 {\ displaystyle \ eta _ {1} = 12}、η2= 7 {\ displaystyle \ eta _ {2} = 7}、η= 19 {\ displaystyle \ eta = 19}
  • N1 = 27 {\ displaystyle N_ {1} = 27}、N2 = 15 {\ displaystyle N_ {2} = 15}、N = 42 {\ displaystyle N = 42}
  • 推定プログラム長の計算:N ^ = 12×log212 + 7×log27 = 62.67 {\ displaystyle {\ hat {N}} = 12 \ times log_ {2} 12 + 7 \ times log_ {2} 7 = 62.67}
  • ボリューム:V = 42×log219 = 178.4 {\ displaystyle V = 42 \ times log_ {2} 19 = 178.4}
  • 難易度:D = 122×157 = 12.85 {\ displaystyle D = {12 \ over 2} \ times {15 \ over 7} = 12.85}
  • 努力:E = 12.85×178.4 = 2292.44 {\ displaystyle E = 12.85 \ times 178.4 = 2292.44}
  • プログラムに必要な時間:T = 2292.4418 = 127.357 {\ displaystyle T = {2292.44 \ over 18} = 127.357}秒
  • 配信されたバグの数:B = 2292.44233000 = 0.05 {\ displaystyle B = {2292.44 ^ {2 \ over 3} \ over 3000} = 0.05}