A certain engineer "COMPLEX"

.NETでコード メトリックスを試してみる 第6回

前回は、サイクロマティック複雑度 について説明をしました。

今回も、個々のメトリックス値がどのように変化していくのか、をテーマに 継承の深さ について説明します。

Explanation

おさらいですが、継承の深さはMSDNのコード メトリックス値というページでの説明によると、

継承の深さ - クラス階層構造のルートまでのクラス定義の数を示します。 階層構造が深くなるにつれて、特定のメソッドおよびフィールドが定義または再定義されている場所を把握することがより困難になる場合があります。

と定義されています。

では、ありきたりな展開ではありますが....
今回も簡単にソースコードを実査に観察して、継承の深さが変化する様子をソースコードを用いて観察してみましょう。

Exercise

今回のサンプルソースは下記です。
管理人の趣味が多分に発揮されていますが無視してください。

今回はいつにも増して残念極まりないソースですが、これを Metrics.exe で計測してみましょう。

下記はメトリックスの結果のうち、クラスに着目した表です。

メトリックス項目HumanStudentKamijoTomaAcceleratorTsuchimikadoMotoharu
MaintainabilityIndex
(保守容易性指数)
100100959695
CyclomaticComplexity
(サイクロマティック複雑度)
11534
ClassCoupling
(クラス結合度)
01545
DepthOfInheritance
(継承の深さ)
12333
LinesOfCode
(コード行)
11534

次は、メトリックスの結果のうち、インターフェイスに着目した表です。

メトリックス項目IImagineBreakerISupernaturalPowerIAcceleratorIMagicIAutoReverse
MaintainabilityIndex
(保守容易性指数)
100100100100100
CyclomaticComplexity
(サイクロマティック複雑度)
21010
ClassCoupling
(クラス結合度)
20101
DepthOfInheritance
(継承の深さ)
00000
LinesOfCode
(コード行)
00000

そして、最後は、上記サンプルのクラスダイアグラム図になります。
図中の DI は Depth of Inheritance (DI) の略です。

前述の定義通りメトリックスの結果から、継承の深さは、クラス階層構造のルートである Object クラス までのクラスの数であることを証明してくれました。

ちなみに、Metrics.exeで mscorlib.dll を計測し、Object クラス のメトリックスを確認すると、継承の深さは 0 でした。

また、もうお気づきでしょうが、継承の深さの計算に、インターフェイスは含まれていません。
インターフェイスはクラスに実装するものですし。継承とは言わないのでしょう。
でも、インターフェイスAを継承したインターフェイスBという実装もあるのですが、これも継承の深さにカウントされません。
前述の「クラス階層構造のルートまでのクラス定義の数」という定義をそのまま素直に受け止めればクラスではないインターフェイスは無関係なのでしょう。

Conclusion

まとめると、継承の深さは、

  • 継承を一切していないクラスを定義しても、1 としてカウントされる。
  • インターフェイスを実装しても継承の深さに影響しない。
  • インターフェイス自身が、別のインターフェイスを継承していたとしても継承の深さは常に 0 である。

継承の深さを低下させるには、全体的な設計の見直しが挙げられます(というかこれ以外あります?)
ただ、継承の深さにそこまで過敏になる必要はないのでは?と個人的には思います。
例えば、System.Windows.Control クラス を継承してカスタムコントロールを作成した時点で、継承の深さは 4 になってしまいます。
ともすれば、既存のクラスを再利用しようとすると、継承の深さは避けては通れない問題ではないのかなぁ、と思ってしまいます。

今回も長くなりましたが、継承の深さがどういうものかわかりました。
次回は クラス結合度 について、ソースコードを交えながら説明します。

コメントを残す

メールアドレスが公開されることはありません。

%d人のブロガーが「いいね」をつけました。