ファイルレベルメトリック

名前 説明 メトリックコード ID 言語
コードの行数 ファイルのコードの行数の計算方法: (最後の行番号) - (最初の行番号) + 1 LOC_FILE 7 C/C++、Java
クラスの宣言の数 グローバルレベルのファイルで宣言されたクラスの数 (内部クラスとそのメンバーはこのメトリックに含まれません) NOCLASSDECL 8 C/C++、Java
定数の宣言の数 グローバルレベルのこのファイルで宣言された定数の宣言の数 NOCONSTDECL 9 C/C++
宣言されたデータアイテムの数 グローバルレベルのこのファイルで宣言されたデータアイテムの数 (任意のクラスの範囲外) NODATADECL 10 C/C++
ファイル内のコメントセクションの数 ファイル内のコメントセクションの数 NOCOMMSECT* 11 C/C++、Java
コメントのバイト数 ファイル内のコメントのバイト数 BYTESCOMM* 12 C/C++、Java
コメントの行数 コメントのあるコードの行数行にコードとコメントの両方が含まれている場合、その行はこのメトリックに含まれます。// 構文を使用するコメントは 1 行としてカウントされます。/* ...*/ 構文を使用する複数行コメントの、明白に区別可能な各行は 1 行としてカウントされます。例: /*複数行のコメント*/ /*別のコメント*/ LINESCOMM = 3 LINESCOMM* 13 C/C++、C#、Java
定義されたマクロの数 ファイルで定義されたマクロの数 NOMACROS* 14 C/C++
ローカルインクルードの数 ローカルインクルードの数 (#include "....." など)。 NOLOCALINC* 15 C/C++
システムインクルードの数 システムインクルードの数 (#include <.....> など)。 NOSYSINC* 16 C/C++
サードパーティインクルードの数 サードパーティインクルードファイルの数 (ファイル名が '/'' または '../' で始まるインクルードの数)。 NO3DPINC* 17 C/C++
ファイル内のインクルードディレクティブの数 ファイル内のインクルードディレクティブの総数 INCLDIRECTIVES* 18 C/C++
ファイル内の関数とメソッドの数 ファイル内にあるクラスメソッドと関数の数 NOROUTINES 19 C/C++、Java
ファイル内のすべてのルーチンのその他のルーチンへの呼び出しの数 ファイル内のすべてのルーチンのその他のルーチンへの呼び出しの総数 RNOCALLS 20 C/C++、Java
ファイル内のすべてのルーチンの条件付きアークの数 ファイル内のすべてのルーチンの条件付きアークの総数 RNOCONDARCS 21 C/C++、Java
ファイル内のすべてのルーチンの最大の条件付きスパン ファイル内のすべてのルーチンの最大の条件付きスパン RMAXCONDSPAN 22 C/C++、Java
ファイル内のすべてのルーチンの制御ネストの最大値 ファイル内のすべてのルーチンの制御ネストの最大値 RMAXLEVEL 23 C/C++、Java
ファイル内のすべてのルーチンの独立したパス数の対数の合計 ファイル内のすべてのルーチンの独立したパス数の対数の合計 RNOINDPATHS 24 C/C++、Java
ファイル内のすべてのルーチンのオペランドの数 ファイル内のすべてのルーチンのオペランドの総数 RNOOPUSED 25 C/C++、Java
ファイル内のすべてのルーチンの演算子の数 ファイル内のすべてのルーチンの演算子の総数 RNOOPRUSED 26 C/C++、Java
ファイル内のすべてのルーチンの McCabe 循環的複雑度メトリックの総数 ファイル内のすべてのルーチンの McCabe 循環的複雑度メトリック (上記のように、ルーチンは関数またはクラスメソッドです) RCYCLOMATIC 27 C/C++、Java
ファイル内の制御ステートメントの数 ファイル内のすべてのルーチンの制御ステートメントの総数 RNOCONTROLSTAT 28 C/C++、Java
ファイル内のすべてのルーチンのローカルで宣言されるデータアイテムの数 ファイル内のすべてのルーチンのローカルで宣言されるデータアイテムの総数 RNOLOCDECL 29 C/C++、Java
ファイル内のすべてのルーチンの実行可能ステートメントの数 ファイル内のすべてのルーチンの実行可能ステートメントの総数 RNOEXSTAT 30 C/C++、Java
ファイル内のすべてのルーチンのコードの行数 ファイル内のすべてのルーチンの LOC の総数 RLOC 31 C/C++、Java
ファイル内のすべてのルーチンの宣言ステートメントの数 ファイル内のすべてのルーチンの宣言ステートメントの総数 RNODECLSTAT 32 C/C++、Java
ファイル内のすべてのルーチンのステートメントの数 ファイル内のすべてのルーチンのステートメントの総数 RNOSTAT 33 C/C++、Java
ファイルの複雑度リスク 変更時の誤った挿入、または作成時の継承のリスクを予測する Klocwork の複雑度インデックスメトリック RISK 34 C/C++、Java
ファイル内のすべてのルーチンのグローバル変数使用の出現数 ファイル内のすべてのルーチンのグローバル変数使用の出現総数 RNOACCTOGLOB 35 C/C++、Java
ファイルのすべてのクラスのメソッド数 同じファイルからの C++ でファイルのクラス内で定義されたメソッドと、スタンドアロンのメソッド CNOMETH 36 C/C++、Java
ファイルのすべてのクラスでクラスがアクセスできる方法の数 クラスにフレンドが含まれる場合に C++ でプライベートメソッドのみがカウントされる、保護メソッド、パブリックメソッド、およびプライベートメソッドの数 CNOMSG 37 C/C++、Java
ファイルの Halstead プログラムのボリュームメトリック。 ファイルの Halstead プログラムのボリュームメトリック。測定およびカウント可能なプロパティは、次のとおりです。
  • n1 = その実装に出現する固有の演算子または区別可能な演算子の数
  • n2 = その実装に出現する固有のオペランドまたは区別可能なオペランドの数
  • N1 = その実装に出現するすべての演算子の総使用数
  • N2 = その実装に出現するすべてのオペランドの総使用数。これらのメトリックから、Halstead は次のように定義します。
  • ボキャブラリ n を n = n1 + n2 として
  • 実装の長さ N を N = N1 + N2 とし、演算子には、"+" や "*" だけでなくインデックス "[...]"、ステートメント \、区切り "..;.." を指定できます。オペランドの数は、リテラル式、定数、変数の数で構成されます。プログラムボリューム: このメトリックは、任意のアルゴリズムの任意の実装のサイズ用です。V = Nlog2n
HALSTEADVOL 38 C/C++、Java
ファイル内の空白行の数 ファイル内の空白行の数 BLANKLINES 39 C/C++
ファイル内のコンパイラディレクティブの数 ファイル内のコンパイラディレクティブの数。カウントされるディレクティブは #if、#ifdef、#ifndef、#else、#endif、および #elif です。 DIRECTIVES* 40 C/C++
ファイルで宣言されたグローバル変数のバイト数 ファイルで宣言されたグローバル変数のバイト数。このメトリックの計算方法の詳細については、組み込み型のサイズの指定を参照してください。 BYTESGLDATADECL 41 C/C++
ファイル内のインクルードファイルネストの最大レベル

ファイル内で最長のインクルードチェインの長さ

このメトリックを正しく計算するには、ヘッダーファイルを含むすべてのディレクトリが Klocwork 解析時に使用可能である必要があります。

MAXINCNEST 42 C/C++
ファイル内で呼び出されるインクルードファイルの総数

翻訳単位でプリプロセッサに含まれるファイルの総数

このメトリックを正しく計算するには、ヘッダーファイルを含むすべてのディレクトリが Klocwork 解析時に使用可能である必要があります。

TOTALINC 43 C/C++
ファイルの CRC32 Checksum 下記の 'Checksum 説明' を参照してください。 CHECKSUM 44 C++
ファイルにコメント、コードの空行なし ファイルにあるコードの行数 (コメント行と空行を除く)。C/C++ ファイルの場合、プリコンパイル後のコードの行数のみがカウントされます。 NCNBLOC_FILE 45 C/C++、C#、Java
最初のファイルレベルの used-by カップリングメトリクス 完全な定義については、下記の '関数ファイルのカップリングと結合' を参照してください。 COUPLINGUB1 1000 C/C++、Java
最初のファイルレベルの uses カップリングメトリクス COUPLINGU1 1001 C/C++、Java
2 番目のファイルレベルの used-by カップリングメトリクス COUPLINGUB2 1002 C/C++、Java
2 番目のファイルレベルの uses カップリングメトリクス COUPLINGU2 1003 C/C++、Java
3 番目のファイルレベルの used-by カップリングメトリクス COUPLINGUB3 1004 C/C++、Java
3 番目のファイルレベルの uses カップリングメトリクス COUPLINGU3 1005 C/C++、Java
4 番目のファイルレベルの used-by カップリングメトリクス COUPLINGUB4 1006 C/C++、Java
4 番目のファイルレベルの uses カップリングメトリクス COUPLINGU4 1007 C/C++、Java
関係の最初の結合番号 COHESION1 1008 C/C++、Java
関係の 2 番目の結合番号 COHESION2 1009 C/C++、Java
関係の 3 番目の結合番号 COHESION3 1010 C/C++、Java
関係の 4 番目の結合番号 COHESION4 1011 C/C++、Java

次のメトリックは、前処理中に計算されます: NOCOMMSECT、LINESCOMM、BYTESCOMM、NOMACROS、NOLOCALINC、NOSYSINC、NO3DPINC、INCLDIRECTIVES、DIRECTIVES。Klocwork プロジェクトが前処理されたファイルを使用してビルドされるか、Klocwork コンパイラが never-cpp オプションを使用して実行される場合、これらのメトリックの値はゼロになります。

Checksum 説明

CHECKSUM メトリックは、ファイルの CRC32 Checksum です。

CRC は Cyclic Redundancy Check (巡回冗長検査) の略です。32 という数字は、32 ビットの Checksum を計算することから来ています。CRC32 はファイル固有の識別子を計算するためのアルゴリズムです。CRC32 は PKZIP のようなプログラムで使用され、ファイルを識別して、それらが元のファイルであることを確認します(2 つのファイルが同じ CRC32 Checksum を持ち、同じファイルとして誤って検出される確率は 1/232 です)。

また、ソースファイルから読み取った文字に対して再帰的に計算されます。このメトリックでは、標準の計算アルゴリズムが使用されます。

計算開始時には、crc32 は 0xffffffff に設定されます。

crc32 = 0^0xffffffff;

次の文字 ch をファイルから読み取るたびに、crc32 が次の式によって更新されます。

crc32(ch) = (ch>>8)^ table[(ch& 0xff) xor crc32];

フィールド

table はあらかじめ生成されていた 256 要素のテーブルです。

crc32 は前のステップで計算された crc32 の値です。

ファイルからすべての文字が読み取られると、crc32 が転置されます。

crc32 = crc32 ^ 0xffffffff;

実際の値 (整数として保存されている値) が ..MAX_INTEGER 間隔に適合せず、-MAX_INTEGER..0 間隔にラップする場合、このメトリックは負の数値になる可能性があります。

関数ファイルのカップリングと結合

2 つのタイプの各関係 (使用する関係と使用される関係) と両方の合計であるメトリックには、4 つのレベルのカップリングメトリクスがあります。下記の '関数ファイルのカップリング (合計)' を参照してください。C/C++ とJava プロジェクトの両方に対してカップリングと結合のメトリックが計算されます。 ただし、次の例では C/C++ サンプルファイルを使用します。

サンプルファイル:a.h、b.h、example.cpp の 3 つのファイルで構成される例を使用して、

COUPLING と COHESION のメトリックが計算されます (以下を参照)。

/space/test/coupling_test>cat -n a.h

1  #ifndef __A_H__ 
2  #define __A_H__ 
3  
4  class Foo { 
5  
6  }; 
7  
8  class Bar { 
9  Foo * foo; 
10 
11 }; 
12 
13 #endif

space/test/coupling_test>cat -n b.h

1 #ifndef __B_H__ 
2 #define __B_H__ 
3 
4 class ZZZ { 
5 
6 }; 
7 
8 #endif

/space/test/coupling_test>cat -n example.cpp

1 #include "a.h" 
2 #include "b.h" 
3
4 Foo *foo1; 
5 Bar *bar; 
6 ZZZ *zzz;

共にコンパイルされるこれら 3 つのファイルに対して計算される関係は次のとおりです。

example.cpp;INCLUDES;b.h;example.cpp;2
example.cpp;INCLUDES;a.h;example.cpp;1 
foo;VARIABLE_USES_CLASS;Foo;example.cpp;4 
bar;VARIABLE_USES_CLASS;Bar;example.cpp;5 
zzz;VARIABLE_USES_CLASS;ZZZ;example.cpp;6 
foo;CLASS-DATA-MEMBER_USES_CLASS;Foo;a.h;9

関数ファイルのカップリング/結合の場合、次の関係のみを取り込みます。

foo;VARIABLE_USES_CLASS;Foo;example.cpp;4 
bar;VARIABLE_USES_CLASS;Bar;example.cpp;5 
zzz;VARIABLE_USES_CLASS;ZZZ;example.cpp;6 
foo;CLASS-DATA-MEMBER_USES_CLASS;Foo;a.h;9

*関係のプリントアウトの形式は次のようになります。

<source>;<relation_kind>;<destination>;<file>;<line>

サンプルファイル a.h エンティティおよび関係

ファイル a.h のエンティティ

a.h;FILE;coupling_test;a.h;1 
__A_H__;MACRO;a.h;a.h;2 
Foo;CLASS;a.h;a.h;4 
Bar;CLASS;a.h;a.h;8 foo;CLASS-DATA-MEMBER;Bar;a.h;9

ファイル a.h の関係

ファイル a.h に記述されているエンティティは、サンプルファイル:a.h、b.h、example.cpp の 4 つの関係のうち 3 つに参加します。

foo;VARIABLE_USES_CLASS;Foo;example.cpp;4 
bar;VARIABLE_USES_CLASS;Bar;example.cpp;5 
foo;CLASS-DATA-MEMBER_USES_CLASS;Foo;a.h;9

uses カップリングメトリクスおよび used-by カップリングメトリクス

"uses" および "used-by" カップリングメトリクス 1 ~ 4 は、ソースとして 1 つのファイルで宣言されたエンティティと、出力先として別のファイルで宣言されたエンティティを持つ関係で計算されます。つまり、関係 foo;CLASS-DATA-MEMBER_USES_CLASS;Foo;a.h;9 は、1 つのファイルにソースと宛先を持つ関係として、カップリングメトリクスの計算に参加しません。その他 2 つの関係と同様に、ファイル a.h のエンティティは宛先として残り 2 つの関係に参加します。

"foo;VARIABLE_USES_CLASS;Foo;example.cpp;4", "bar;VARIABLE_USES_CLASS;Bar;example.cpp;5"

つまり、ファイル a.h のエンティティはファイル a.h の他にエンティティとの関係を持ちません。結果として、すべての COUPLINGU メトリック 1 ~ 4 は 0 になります。

サンプルファイル a.h: カップリング (使用) メトリクスを参照してください。

サンプルファイル a.h: カップリング (使用) メトリクスを参照してください

ファイルの自明ではない測定では、このファイルに関連付けられた uses 関係が使用されます。さらに具体的に言うと、メトリックは、使用するシステムのその他すべてのファイルに対してこのファイルの関係の、情報が濃密な測定を表します。

以下の式は、サンプルファイル a.h に適用されます。サンプルファイル a.h エンティティおよび関係を参照してください。

C および C++ システムにおける Klocwork システムレベルのレポートの場合、uses カップリングの自明ではない測定は、次のようになります。

COUPLING U1

CpU1 (Fj) =

Image:Revised_uses_coupling_formula.png

フィールド

i = 1, ..., n は関連する関係の種類のインデックスです。ファイル a.h の場合、関係の種類は VARIABLE_USES_CLASS、CLASS-DATA-MEMBER_USES_CLASS です。

システム S の任意の j に対して、Fj はシステム S の重要なファイルです。この例の場合、Fj はファイル a.h です。

Fk はシステム S(Image:J_not_equal_K.png) 内のその他のファイルです。サンプルファイルを使用する場合、システム S は 3 つのファイル、a.h、b.h、および example.cpp から構成されます。したがって、条件 Image:J_not_equal_K.png により、Fk は b.h と example.cpp となります。

l=1, ..., lj はファイル Fj 内の関数/メソッド/プロシージャ (まとめてユニットと呼びます) に関連するインデックスです (つまり、ファイル Fj の最初のユニットはユニット 1、2 番目はユニット 2...、最後はユニット lj と見なします)。そして、

m=1, ..., mk はファイル Fk 内のユニットに関連するインデックスです。ファイル a.h のユニットは次のようになります。CLASS Foo、CLASS Bar、および CLASS-DATA-MEMBER foo です。これらは、ファイル b.h では CLASS ZZZ、ファイル example.cpp では VARIABLEs foo、bar、および zzz です。

URIi(Fj(l), Fk(m)) は、ファイル Fj のユニット l とファイル Fk のユニット m の間のタイプ i の uses 関係 (または関係インスタンス、RI) のインスタンス数をカウントする関数です (Fj のユニット l は Fk のユニット m を使用します)。0 または 1 以上が返されます。ファイル a.h のソースとファイル a.h の外の宛先との間に関係性はありません。そのため、ファイル a.h の COUPLINGU1 を計算すると、引数 Fj(l) および Fk(m) として許容される任意のユニットの URIi(Fj(l), Fk(m)) は 0 を返します。log2(0 +1) の和 0 を求めると、COUPLINGU1 の総和は 0 になります。

Wi- はタイプ i の関係の重みです。ファイル a.h の重みのために COUPLINGU1 を計算した例では、重みが 0 であるため、重みは重要ではありません。また、デフォルトでは、すべての関係の重みは 1 と等しくなります (すべての関係はカップリング関数の影響の面で等しくなります)。潜在的には、より高い値またはより低い値を重みに設定することによって、関係の影響を強くも弱くもすることができます (たとえば、CLASS-DATA-MEMBER_USES_CLASS の重みを 1 に、VARIABLE_USES_CLASS の重みを 0.5 に設定します)。

また、式からわかるように、ファイル a.h のソースと a.h の外の宛先の関係性が強くなると、メトリックが高くなります。また、異なるペア (ソースと宛先) が増えると、メトリックが高くなります。

異なるペア (ソースと宛先) の複数の関係は、同じペア (ソースと宛先) のエンティティ間の同数の関係よりも COUPLINGU1 に寄与します。対数は、同じペア (ソースと宛先) 内の 2 番目、3 番目の関係などの値を減らします。

COUPLINGU2、COUPLINGU3、および COUPLINGU4

同じ理由で (外へ向かう関係がない)、COUPLINGU2、COUPLINGU3、および COUPLINGU4 は 0 になります。これらの計算に使用する式を次に示します。

Image:COUPLINGU2.png

COUPLINGU1 と COUPLINGU2 の違いは、対数が適用されるポイントです。COUPLINGU1 の場合、ユニットの各ペアの関係を計算し、それぞれに対数を適用します。COUPLINGU2 の場合、ユニットのペアの間を区別しません。あるファイルのエンティティから別のファイルのエンティティに移る特定の種類の関係を合計し、このカウントに対数を適用します (+1)。

Image:COUPLINGU3.png

COUPLINGU3 は COUPLINGU2 とほとんど同じメトリックですが、この関係には重みを適用しません。デフォルトで、すべての関係の重みは 1 であるため、COUPLINGU2 は COUPLINGU3 と等しくなります。

Image:COUPLINGU4.png

COUPLINGU4 は、さまざまな種類の関係間を区別しません。ファイルのソースユニット (この例では a.h) とその他のファイルの宛先ユニット (a.h 以外のファイル) の関係を合計します。計算された合計 + 1 に対数が適用されます。

サンプルファイル例cpp: カップリング (使用) メトリクスを参照してください

このトピックでは、ファイル example.cpp に 4 つのカップリング (使用) メトリクスを適用します。

ファイル example.cpp のソースとファイル example.cpp の外の宛先との間には 3 つの関係があります。

foo;VARIABLE_USES_CLASS;Foo;example.cpp;4 
bar;VARIABLE_USES_CLASS;Bar;example.cpp;5 
zzz;VARIABLE_USES_CLASS;ZZZ;example.cpp;6

したがって、

URIVARIABLE_USES_CLASS(VARIABLE foo, CLASS Foo) = 1, VARIABLE foo uses CLASS Foo 
URIVARIABLE_USES_CLASS(VARIABLE bar, CLASS Bar) = 1, VARIABLE bar uses CLASS Bar 
URIVARIABLE_USES_CLASS(VARIABLE zzz, CLASS ZZZ) = 1, VARIABLE zzz uses CLASS ZZZ

COUPLING U1

その結果、

COUPLINGU1 =
log2(URIVARIABLE_USES_CLASS(VARIABLE foo, CLASS Foo) + 1) +
log2(URIVARIABLE_USES_CLASS(VARIABLE bar, CLASS Bar) + 1) +
log2(URIVARIABLE_USES_CLASS(VARIABLE zzz, CLASS ZZZ)+ 1) = 3

COUPLINGU2 = COUPLINGU3 = COUPLINGU4 =

COUPLINGU2 = COUPLINGU3 = COUPLINGU4 =
log2(URIVARIABLE_USES_CLASS(VARIABLE foo, CLASS Foo) + 
URIVARIABLE_USES_CLASS(VARIABLE bar, CLASS Bar) + 1) +
log2(URIVARIABLE_USES_CLASS(VARIABLE zzz, CLASS ZZZ)+ 1) = 2.58496

対数が各ペア (ソースと宛先) の関係カウントに個別に適用されるため、COUPLINGU1 には 3 つの対数があります。

COUPLINGU2、COUPLINGU3、および COUPLINGU4

ユニットのペア間は区別されず、ファイルのペア間のみが区別され、使用可能なペアは (example.cpp、a.h) と(example.cpp、b.h) であるため、COUPLINGU2、COUPLINGU3、および COUPLINGU4 には 2 つの対数があります。

サンプルファイル a.h: カップリング (使用される) メトリクス

C および C++ システムにおける Klocwork システムレベルのレポートの場合、used-by カップリングの自明ではない測定は、次のようになります (次の式はサンプルファイル a.h に適用されます)。

CpUB1 (Fj) =

Image:Functional_file_coupling_formula.png

フィールド

i = 1 ..., n は関連する関係の種類のインデックスです。ファイル a.h の場合、これは VARIABLE_USES_CLASS、CLASS-DATA-MEMBER_USES_CLASS に適用されます。

システム S の任意の j に対して、Fj はシステム S の重要なファイルです。この例の場合はファイル a.h です。

Fk はシステム S(Image:J_not_equal_K.png) 内のその他のファイルです。その他のファイルは、b.h とexample.cpp です。サンプルファイル:a.h、b.h、example.cpp の 3 つのファイルで構成される例を使用して、

l=1, ..., lj はファイル Fj 内の関数/メソッド/クラス/タイプ (まとめてユニットと呼びます) に関連するインデックスです (つまり、ファイル Fj の最初のユニットはユニット 1、2 番目はユニット 2...、最後はユニット lj と見なします)。ファイル a.h の場合、CLASS Foo と CLASS Bar、そして

m=1, ..., mk はファイル Fk 内のユニットに関連するインデックスです。ファイル b.h の場合、CLASS ZZZ になります。ファイル example.cpp の場合、VARIABLEs foo、bar、および zzz になります。

UBRIi( Fj(l), Fk(m) ) は、ファイル Fj のユニット l とファイル Fk のユニット m の間のタイプ i の used-by 関係 (または関係インスタンス、RI) のインスタンス数をカウントする関数です。0 または 1 以上が返されます。サンプルファイルを使用する場合、

UBRI(CLASS Foo, VARIABLE foo) = 1, CLASS Foo is used by VARIABLE foo

UBRI(CLASS Bar, VARIABLE bar) = 1.CLASS Boo は VARIABLE バーにより使用されます

Wi - タイプ i の関係の重み。デフォルトでは、サンプルファイルですべての重みは 1 になります。

a.h の場合:

COUPLINGUB1 = 
log2(UBRIVARIABLE_USES_CLASS (CLASS Foo, VARIABLE foo) + 1) + 
log2(UBRIVARIABLE_USES_CLASS (CLASS Bar, VARIABLE bar) + 1) = 2

COUPLINGUB2 = COUPLINGUB3 = COUPLINGUB4 = 
log2(UBRIVARIABLE_USES_CLASS (CLASS Foo, VARIABLE foo) + 
UBRIVARIABLE_USES_CLASS (CLASS Bar, VARIABLE bar) + 1) = 1.58496

COUPLINGUB2、COUPLINGUB3、および COUPLINGUB4

同じ理由で (外へ向かう関係がない)、COUPLINGUB2、COUPLINGUB3、COUPLINGUB4 は 0 になります。これらの計算に使用する式を次に示します。

Image:COUPLINGUB2.png

COUPLINGUB1 と COUPLINGUB2 の違いは、対数が適用されるポイントです。COUPLINGUB1 の場合、ユニットの各ペアの関係を計算し、それぞれに対数を適用します。COUPLINGUB2 の場合、ユニットのペアの間を区別しません。あるファイルのエンティティから別のファイルのエンティティに移る特定の種類の関係を合計し、このカウントに対数を適用します (+1)。

Image:COUPLINGUB3.png

COUPLINGUB3 は COUPLINGUB2 とほとんど同じメトリックですが、この関係には重みを適用しません。デフォルトで、すべての関係の重みは 1 であるため、COUPLINGUB2 は COUPLINGUB3 と等しくなります。

Image:COUPLINGUB4.png

COUPLINGUB4 は、さまざまな種類の関係間を区別しません。ファイルのソースユニット (この例では a.h) とその他のファイルの宛先ユニット (a.h 以外のファイル) の関係を合計します。計算された合計 + 1 に対数が適用されます。

関数ファイルのカップリング (合計)

ファイルの自明ではない測定では、このファイルに関連付けられた uses 関係と used-by 関係が使用されます。これは、ファイルカップリング (使用) とファイルカップリング (使用される) の合計です。

関数ファイルの結合

関数ファイルの結合は、ファイル内の自明ではない測定で、ファイルに関連付けられた used-by 関係が使用されます。さらに具体的に言うと、メトリックは、ファイル内の関数、ルーチン、またはユニットの、標準化され情報が濃密な測定と、同じファイル内のその他の関数、ルーチン、またはユニットとのそれらの関係を表します。

一般的に、COHESION メトリックは used および used-by COUPLING メトリックと同様のものです。COUPLING メトリックと COHESION メトリックの違いは、メトリックを計算するために集約する関係にあります。COUPLING メトリックの場合、別々のファイルにあるソースユニットと出力先ユニットとの関係を取り込みます。これは、同じファイルにあるソースユニットと出力先ユニットとの関係を取り込む COHESION メトリックとは正反対の部分です。COHESION 1 ~ 4 メトリックの計算に使用される式を次に示します。

COHESION1 metric

Image:COHESION_Metric1.png

フィールド

i = 1, ..., n は関連する関係の種類のインデックスです。

Fj はシステム S の重要なファイルです。

l=1, ..., lj はファイル Fj 内の関数/メソッド/クラス/タイプ (まとめてユニットと呼びます) に関連するインデックスです (つまり、ファイル Fj の最初のユニットはユニット 1、2 番目はユニット 2...、最後はユニット lj と見なします)。そして、

m=1, ..., mj もファイル Fj 内のユニットに関連するインデックスです。ただし m

URIi( Fj(l), Fj(m)) は、ファイル Fj のユニット l とファイル Fj のユニット m の間のタイプ i の uses 関係 (または関係インスタンス、RI) のインスタンス数をカウントする関数です (ユニット l はユニット m を使用します)。0 または 1 以上が返されます。これは、以前定義した命名法を使用して、関係メトリックテーブルで定義されたメトリックの "ミクロ" バージョンの計算と等しいものです。

Wi - タイプ i の関係の重み。

COHESION2 メトリック

Image:COHESION_Metric2.png

COHESION3 メトリックでは、重みを考慮しません。デフォルトで、すべての関係の重みは 1 であるため、COHESION2 は COHESION3 と等しくなります。

COHESION3 メトリック

Image:COHESION_Metric4.png

サンプルファイルの使用: a.h、b.h、および example.cpp を使用して、内部にソースと出力先の関係を持つ唯一のファイルはヘッダー a.h です。1 つのファイルのソースと出力先の関係を次に示します。

foo;CLASS-DATA-MEMBER_USES_CLASS;Foo;a.h;9

そのため、URICLASS-DATA-MEMBER_USES_CLASS (CLASS-DATA-MEMBER foo, CLASS Foo) = 1

上記の理由で、ファイル a.h の場合は次のようになります。

COHESION1 = COHESION2 = COHESION3 = COHESION4 = 
log2(URICLASS-DATA-MEMBER_USES_CLASS (CLASS-DATA-MEMBER foo, CLASS Foo) + 1) = 1