コードメトリクス
CppDepend でコード メトリクスの力を解き放つ
メトリクスを学ぶには、これを印刷できます プレースマット可視化エキスパート による Stuart Celarier MVP (Corillian) またはこれを印刷できます メトリクスチートシート による Frank-Leonardo Quednau.
- 8つのアプリケーションメトリクス: NbLinesOfCode, NbLinesOfComment, PercentageComment, NbProjects, NbNamespaces, NbTypes, NbMethods, NbFields
- 14のプロジェクトメトリクス: NbLinesOfCode, NbLinesOfComment, PercentageComment, NbNamespaces, NbTypes, NbMethods, NbFields, Assembly level, Afferent coupling (Ca), Efferent coupling (Ce), Relational Cohesion(H), Instability (I), Abstractness (A), Distance from main sequence (D)
- 9つの名前空間メトリクス: NbLinesOfCode, NbLinesOfComment, PercentageComment, NbTypes, NbMethods, NbFields, Project level, Afferent coupling at namespace level (NamespaceCa), Efferent coupling at namespace level (NamespaceCe)
- 16の型メトリクス: NbLinesOfCode, NbLinesOfComment, PercentageComment, NbMethods, NbFields, Type level, Type rank, Afferent coupling at type level (TypeCa), Efferent coupling at type level (TypeCe), LCOM, LCOM HS, Cyclomatic Complexity, Size of instance, ABC, NOC, DIT
- 11のメソッドメトリクス: NbLinesOfCode, NbLinesOfComment, PercentageComment, Method level, Method rank, MethodCa, MethodCe, Cyclomatic Complexity, NbParameters, NbVariables, NbOverloads
- 2つのフィールドメトリクス: インスタンスサイズ、FieldCa
- 11 Halsteadメトリクス: Total Operators, Total Operands, Distinct Operators, Distinct Operands, Halstead Program Length, Halstead Program Volume, Halstead Program Level, Halstead Program Difficulty, Halstead Programming Effort, Halstead Programming Time, Halstead Intelligent Content
技術的負債メトリクス
バージョン2017.1.0以降、CppDependは提供 スマートな技術的負債見積もり コードベースの。
基本的に、各 CppDepend コード ルールは問題を生成し、各問題について、カスタマイズ可能な C# 式が次を見積もります 修正コスト これらの問題を人時で。
この修正コストはと見なせる 負債 チームが抱えているもの:問題が修正されない限り、負債は返済されず、開発の摩擦という形で利息が発生します。コードベースの技術的負債は、これらすべての負債推定値の合計です。
技術的負債はと見なせる すべてのコードメトリクスの母.
- その他すべてのコードメトリクス(コード行数、複雑さ、コードカバレッジ、結合度…)は、しきい値を持つコードルールを通じて活用できます。ルールは、コードメトリクスのしきい値違反時に問題を生成します。
- そして各問題について、を見積もれます 修正コスト の観点で 人時.
- 各問題について、も見積もれます 重要度 の観点で 問題が未修正のままであるために消費される年間の人時 結果。
以下に、CppDepend がサポートする各コード メトリックの技術的詳細を示します。技術的負債の見積もりには独自の ドキュメントページ.
コードメトリクス可視化
CppDepend には、すべてのアプリケーションメトリクスをすばやく視覚化するダッシュボードが付属しています。ダッシュボードは、Visual Studio 拡張機能とレポートの両方で利用できます。
各メトリックについて、ダッシュボードにはベースラインからの差分が表示されます。また、メトリック値が改善(緑)か悪化(赤)かも表示されます。
各値はクリックして詳細を確認できます。たとえば、型の数をクリックすると、コード ベースのすべての型が一覧表示されます。

CppDepend は、色付きツリーマップによる特別なメトリクスビジュアライゼーションも提供します。このようなビジュアライゼーションは、コードベースのメソッドやクラスのテストによるコードカバレッジを閲覧するのに特に便利です。

アプリケーションのメトリクス
NbLinesOfCode
型の LOC はそのメソッドの LOC の合計、名前空間の LOC はその型の LOC の合計、プロジェクトの LOC はその名前空間の LOC の合計、アプリケーションの LOC はそのプロジェクトの LOC の合計であることに注意してください。
- 抽象メソッドと列挙型の LOC は 0 です。LOC の計算では、実際に実行される具体的なコードのみが考慮されます。
- 名前空間、型、フィールド、メソッドの宣言は、対応するシーケンス ポイントがないため、コード行とは見なされません。
推奨事項: NbLinesOfCode が 20 を超えるメソッドは理解と保守が困難です。
NbLinesOfComment
アプリケーション、プロジェクト、名前空間、型、メソッドに対して定義。
推奨事項: このメトリックはソース コードの品質評価には役立ちません。代わりに次のメトリックを使用します PercentageComment.
PercentageComment
アプリケーション、プロジェクト、名前空間、型、メソッドに対して定義。
PercentageComment = 100*NbLinesOfComment / ( NbLinesOfComment + NbLinesOfCode)
推奨事項: コメントの割合が 20% 未満のコードは、より多くコメントを付けるべきです。ただし、コメントが多すぎるコード(>40%)は、読者の知性への侮辱と見なされる可能性があるため、必ずしも良いことではありません。
NbProjects
アプリケーションに対して定義 - プロジェクト数。
NbNamespaces
アプリケーションとプロジェクトに対して定義されます。名前空間の数。匿名名前空間は 1 つとしてカウントされます。名前空間が N 個のプロジェクトにまたがって定義されている場合、N としてカウントされます。フレームワークプロジェクトで宣言された名前空間は考慮されません。
NbTypes
アプリケーション、プロジェクト、名前空間に対して定義されます。型の数。型は抽象クラス、具象クラス、構造体、列挙型のいずれかです。
NbMethods
アプリケーション、プロジェクト、名前空間、型に対して定義されます。メソッドの数。メソッドは、抽象メソッド、仮想メソッド、非仮想メソッド、インターフェイスで宣言されたメソッド、コンストラクター、クラスコンストラクター、ファイナライザー、プロパティ/インデクサーのゲッターまたはセッター、イベントの追加または削除メソッドのいずれかです。
推奨事項: NbMethods > 20 の型は理解および保守が難しい場合がありますが、NbMethods の値が高いことが妥当なケースもあります。
NbFields
アプリケーション、プロジェクト、名前空間、型に対して定義。フィールドの数。
推奨事項: NbFields が 20 を超える型は理解および保守が難しい場合がありますが、NbFields の値が高いことが妥当なケースもあります。
プロジェクトのメトリクス
アプリケーションの型間の結合を測定することで、CppDepend は各プロジェクトの安定性を評価します。プロジェクトの型が他のプロジェクトの多くの型によって使用されている場合、そのプロジェクトは安定していると見なされます(つまり、安定 = 変更が困難)。プロジェクトに多くの抽象型と少数の具象型が含まれている場合、そのプロジェクトは抽象的と見なされます。 したがって、CppDepend は、保守が困難な可能性のあるプロジェクト(具体的で安定しているもの)と、潜在的に無用なプロジェクト(抽象的で不安定なもの)を検出するのに役立ちます。
注意: この理論とメトリックは、優れた書籍によって最初に紹介されました Agile Software Development: Principles, Patterns, and Practices in C# Robert C. Martin (Prentice Hall PTR, 2006)
求心結合(Ca)
このプロジェクト外の型のうち、このプロジェクト内の型に依存している型の数。高いアフェレント結合度は、対象のプロジェクトが多くの責任を持っていることを示します。
遠心結合(Ce)
このプロジェクト内の型のうち、このプロジェクト外の型に依存している型の数。高いエフェレント結合度は、対象のプロジェクトが依存していることを示します。
関係的凝集度(H)
型あたりの内部関係の平均数。R をこのプロジェクトに内部の型関係の数(つまりプロジェクト外の型に接続しないもの)とします。N をプロジェクト内の型の数とします。H = (R + 1)/ N。式の余分な 1 は、N=1 のときに H=0 になるのを防ぎます。関係的結束度は、このプロジェクトがそのすべての型と持つ関係を表します。
推奨事項: プロジェクト内のクラスは強く関連しているべきであるため、結束度は高くあるべきです。一方、値が高すぎる場合は過度の結合を示している可能性があります。RelationalCohesion の適切な範囲は 1.5 ~ 4.0 です。
不安定性(I)
エフェレント結合度(Ce)と総結合度の比率。I = Ce / (Ce + Ca)。このメトリクスは、パッケージの変更に対する回復力の指標です。このメトリクスの範囲は 0 から 1 で、I=0 は完全に安定したパッケージを示し、I=1 は完全に不安定なパッケージを示します。
抽象度(A)
内部抽象型の数と型の総数の比率。このメトリクスの範囲は 0 から 1 で、A=0 は完全に具体的なプロジェクトを示し、A=1 は完全に抽象的なプロジェクトを示します。
主系列からの距離(D)
理想化された直線 A + I = 1(主系列と呼ばれる)からのプロジェクトの垂直正規化距離。このメトリクスは、抽象性と安定性の間のプロジェクトのバランスの指標です。範囲は 0 から 1 で、D=0 は主系列と一致するプロジェクトを示し、D=1 は主系列から可能な限り遠いプロジェクトを示します。
推奨事項: NormDistFromMainSeq が 0.7 を超えるプロジェクトは問題がある可能性があります。
名前空間のメトリクス
名前空間レベルの求心結合(NamespaceCa)
特定の名前空間の Afferent Coupling は、それに直接依存する名前空間の数です。
名前空間レベルの遠心結合(NamespaceCe)
特定の名前空間のエフェレント結合度(Efferent Coupling)は、その名前空間が直接依存している名前空間の数です。フレームワークプロジェクトで宣言された名前空間も考慮されることに注意してください。
レベル
プロジェクト、名前空間、型、メソッドに対して定義。名前空間の Level 値は次のように定義されます:
- Level = 0 : if the namespace doesn't use any other namespace.
- Level = 1 : if the namespace only uses directly namespace defined in tierce projects.
- Level = 1 + (Max Level over namespace it uses directly)
- Level = N/A : if the namespace is involved in a dependency cycle or uses directly or indirectly a namespace involved in a dependency cycle.
推奨事項: このメトリクスは、プロジェクト、名前空間、型、メソッドを高レベル、中レベル、低レベルとして客観的に分類するのに役立ちます。このメトリクスは、アプリケーション内の依存関係サイクルを発見するのにも役立ちます。
型のメトリクス
型ランク
TypeRank値はを適用して計算 Google PageRank 型の依存関係グラフに対するアルゴリズム。TypeRank の平均が 1 になるように、中心 0.15 のホモセティが適用されます。
推奨事項: TypeRank の高い型は、そのような型のバグはより壊滅的になる可能性が高いため、より慎重にテストする必要があります。
型レベルの求心性結合 (TypeCa)
特定の型の Afferent Coupling は、それに直接依存する型の数です。
型レベルの遠心性結合 (TypeCe)
特定の型のエフェレント結合度(Efferent Coupling)は、その型が直接依存している型の数です。フレームワークプロジェクトで宣言された型も考慮されることに注意してください。
推奨事項: TypeCe > 50 の型は、他の多くの型に依存しすぎている型です。これらは複雑で、複数の責任を持っています。リファクタリングの良い候補です。
メソッド凝集度の欠如(LCOM)
単一責任の原則は、クラスは変更する理由を 2 つ以上持つべきではないと述べています。そのようなクラスは凝集性が高いと言われます。高い LCOM 値は一般に凝集性の低いクラスを示します。LCOM は [0-1] の範囲の値を取ります。LCOM HS(HS は Henderson-Sellers の略)は [0-2] の範囲の値を取ります。1 を超える LCOM HS 値は危険信号と見なすべきです。
CppDependが使用するアルゴリズム:
- LCOM = 1 – (sum(MF)/M*F)
- LCOM HS = (M – sum(MF)/F)(M-1)
- ここで、M はクラス内のメソッド数、F はクラス内のインスタンスフィールド数、MF は特定のインスタンスフィールドにアクセスするクラスのメソッド数です。
推奨事項: LCOM > 0.8 かつ NbFields > 10 かつ NbMethods > 10 の型は問題がある可能性があります。LCOMHS > 1.0 かつ NbFields > 10 かつ NbMethods > 10 の型は避けるべきです。
循環的複雑度 (CC)
型とメソッドに対して定義されます。循環的複雑度は、プロシージャ内で取り得る決定の数に等しい、一般的な手続き型ソフトウェアメトリクスです。具体的には、C++ ではメソッドの CC は 1 + {メソッド本体内で見つかった次の式の数}:
カウント: if | while | for | case | default | continue | goto | && | || | catch | ternary operator ?: | ??
カウントされない: else | do | switch | try | using | throw | finally | return | object creation | method call | field access
推奨事項: CC が 15 を超えるメソッドは理解および保守が困難です。CC が 30 を超えるメソッドは非常に複雑であり、より小さなメソッドに分割すべきです(ツールによって自動生成される場合を除く)。
インスタンスサイズ
インスタンスフィールドと型に対して定義されます。インスタンスフィールドのインスタンスのサイズは、その型のインスタンスのバイト単位のサイズとして定義されます。静的フィールドのインスタンスのサイズは 0 です。
クラスまたは構造体のインスタンスのサイズは、そのフィールドのインスタンスのサイズの合計に基底クラスのインスタンスのサイズを加えたものとして定義されます。
推奨事項: SizeOfInst が 64 を超える型は、パフォーマンスを低下させ、保守が困難になる場合があります。
Association Between Class (ABC)
特定のクラスまたは構造体の Association Between Classes メトリクスは、そのメソッドの本体で直接使用している他の型のメンバーの数です。
子の数(NOC)
クラスの子の数は、サブクラスの数です(継承ツリーのサブブランチ内の位置に関係なく)。インターフェイスの子の数は、それを実装する型の数です。どちらの場合も、このメトリクスの計算はアプリケーションコードで宣言された型のみをカウントします。
継承ツリーの深さ(DIT)
クラスまたは構造体の Depth of Inheritance Tree は、その基底クラスの数です(System.Object クラスを含むため、DIT >= 1)。
推奨事項: DepthOfInheritance が 6 を超える型は保守が困難な場合があります。
メソッドのメトリクス
メソッドランク
MethodRank値はを適用して計算 Google PageRank メソッドの依存関係グラフに対するアルゴリズム。MethodRank の平均が 1 になるように、中心 0.15 のホモセティが適用されます。
推奨事項: MethodRank の高いメソッドは、そのようなメソッドのバグはより壊滅的になる可能性が高いため、より慎重にテストする必要があります。
メソッドレベルの求心結合(MethodCa)
特定のメソッドの Afferent Coupling は、それに直接依存するメソッドの数です。
メソッドレベルの遠心結合(MethodCe)
特定のメソッドのエフェレント結合度(Efferent Coupling)は、そのメソッドが直接依存しているメソッドの数です。フレームワークプロジェクトで宣言されたメソッドも考慮されることに注意してください。
NbParameters
メソッドのパラメータ数。Ref と Out もカウントされます。IL でインスタンスメソッドに渡される this 参照はパラメータとしてカウントされません。
推奨事項: NbParameters が 5 を超えるメソッドは、呼び出しにくく、パフォーマンスを低下させる場合があります。
NbVariables
メソッド本体内で宣言された変数の数。
推奨事項: NbVariables が 8 を超えるメソッドは理解および保守が困難です。NbVariables が 15 を超えるメソッドは非常に複雑であり、より小さなメソッドに分割すべきです。
NbOverloads
メソッドのオーバーロード数。メソッドがオーバーロードされていない場合、その NbOverloads 値は 1 になります。このメトリクスはコンストラクターにも適用されます。
推奨事項: NbOverloads が 6 を超えるメソッドは、保守に問題があり、必要以上に高い結合を引き起こす可能性があります。
フィールドのメトリクス
フィールドレベルの求心結合(FieldCa)
特定のフィールドの Afferent Coupling は、それを直接使用するメソッドの数です。
Halsteadメトリクス
CppDepend は、Maurice H. Halstead が Elements of Software Science(1977)で定義したさまざまな Halstead メトリクスを計算します。Halstead メトリクスは演算子とオペランドの定義に基づいています。
- 演算子: 算術('+')、等価/非等価('<')、代入('+=')、シフト('>>')、論理('&&')、単項('*')演算子。制御ポイント('while')と制御基盤('else')、型('double')、ストレージ('extern')を指定する予約語。関数呼び出し、配列参照など。
- オペランド: 識別子、リテラル、ラベル、関数名。各リテラルは個別のオペランドとして扱われます。
総演算子 (N1)
型とメソッドに対して定義。存在する演算子の総数。
総オペランド (N2)
型とメソッドに対して定義。存在するオペランドの総数。
個別演算子 (n1)
型とメソッドに対して定義。存在する個別演算子の数。
個別オペランド (n2)
型とメソッドに対して定義。存在する個別オペランドの数。上記のとおり、すべての定数は個別として扱われます。
Halsteadプログラム長 (N)
N = N1 + N2
Halstead プログラム長は、元のプログラムから演算子とオペランド以外のすべてを取り除いて得られる抽象化されたプログラムのサイズを表します。
Halsteadプログラムボリューム (V)
V = N * log2(n1 + n2)
これは、長さ N の抽象化プログラムを格納するために必要なビット数をモデル化します。
Halsteadプログラムレベル (L)
L = (2/n1)*(n2/N2)
L は、現在のプログラムのボリューム V と、同じアルゴリズムの最もコンパクトな実装のボリューム V* との比率を表します。
Halsteadプログラム難易度 (D)
D = (n1/2) * (N2/n2) = 1/L
Difficulty は Level の逆数です。Difficulty は一意な演算子の数が増えると増加します。
Halsteadプログラミング工数 (E)
E = D * V
プログラムの作成(または理解)に必要な労力に関する Halstead の定式化では、労力は難易度とボリュームの両方に比例するものとして特徴づけられます。
Halsteadプログラミング時間 (T)
T = E/18秒
プログラミング時間はプログラミング工数に正比例すると見なされます。
Halsteadインテリジェントコンテンツ (I)
I = V / D
Halstead はこのメトリックを、言語に依存しないアルゴリズム複雑度の尺度として意図しました。
