メトリクスとは何か

2008年4月28日(月)
長谷川 裕一

メトリクスの実際

 まずパッケージのメトリクスとして、「Instability(不安定性)メトリクス」を取り上げます。

 InstabilityはRobert Martinにより提案された、パッケージの内と外に向かう依存関係から導き出す値で、最も安定したパッケージを表す「0」から、最も不安定なパッケージを表す「1」までで表現されます。

 値の求め方は、パッケージ間の関係で、ほかのパッケージ内のクラスから自パッケージのクラスに依存された数をCa(内側に向かう結合度)とし、自パッケージ内のクラスからほかのパッケージのクラスに依存する数をCe(外側に向かう結合度)として、[Ce÷(Ca+Ce)]で求めます。

 また、パッケージはInstabilityと、「Abstractness(抽象度)メトリクス」を合わせて利用することで、Distance(距離)メトリクスを求めることができます。

 Abstractnessは、パッケージ内に抽象クラスがどれくらい実装されているかを示すもので、[パッケージ内の抽象クラス÷パッケージ内のすべてのクラス数]で求めます。

 Distanceは、「Abstractness + Instability - 1」の絶対値として測定されますが、計算結果は一般的にはAbstractnessとInstabilityを2軸とするA-Iグラフ上に、Abstractness=1、Instability=0から始まり、Abstractness=0、Instability=1に向かうMain Sequence(主系列)と呼ばれる直線ラインを描き、Main SequenceからのDistanceとして描き表されます。

 A-Iグラフとして表されることで、「Main Sequenceの線上に近いパッケージは、適度なInstabilityと、Abstractnessである」「Main Sequenceの線上から離れ、Abstractness=1に近いパッケージは、抽象度は高いが誰からも使用されていない」「Main Sequenceの線上から離れ、Instability=1に近いパッケージは抽象度が低い割にはほかから依存され過ぎている」といったことが可視化され分かりやすくなります。

 こうしたパッケージのメトリクスを利用することで、パッケージをMain Sequenceの線上から大きく離れないように管理することが可能となります。もちろん、Main Sequenceの線上から大きく離れることが正しいパッケージというのも存在します。

クラスのメトリクスとメソッドのメトリクス

 次にクラスのメトリクスを解説します。クラスのメトリクスとして代表的なものは、ChidamberとKemererの提案による6つのOO(Object Oriented)の設計と複雑度を計るCK尺度です。CK尺度はSmalltalkやC++などでの実証実験数も多く、その有効性は高いものです。

 6つのOOについて説明しましょう。1つ目は「WMC(Weighted of Methods per Class)」で、クラスの複雑度を表します。この値が大きいとテストや保守が困難になると推測できます。2つ目は「DIT(Depth of Inheritance Tree)」で、継承ツリーの深さを表します。この値が大きいと、継承しているクラスの仕様変更の影響を受ける可能性が高く、可読性も低いことを意味しています。

 3つ目が「NOC(Number of Children)」で子クラスの数を表します。この値が大きいと、そのクラスを変更した時に影響を受けるクラスが多いと判断されます。4つ目が「CBO(Coupling Between Objects)」でクラス間の結合度を表します。CBOとLCOMの値が大きいクラスが多い時は、生産性が落ちると推測できます。

 5つ目がRFC(Response for Class)で、クラスの応答数を表します。もしこの値が大きければ、そのクラスの複雑度が高いと判断されます。6つ目がLCOM(Lack of Cohesion of Methods)でクラスの凝集度を表します。もしこの値が小さければ、そのクラスの凝集度は低く、分割を考えます。

 最後にメソッドのメトリクスとして、McCabeのCyclomatic Complexity(循環的複雑度)を解説します。Cyclomatic Complexityはプログラムのテスト容易性と保守性(理解のしやすさ)を表現します。

 Javaの場合の一般的なCyclomatic Complexityの測定方法は、メソッド中のif文やwhile文の数に1を加算したものになります。私の経験的にはCyclomatic Complexityが4を越えるようなら、テストはやっかいです。

 また、Cyclomatic Complexityを使うことで、複雑なプログラムを特定し、インスペクションを実施するなどの管理も可能となります。
 以上ここまで、パッケージとクラス、メソッドの代表的なメトリクスについて解説してきました。次からはメトリクスを測定するツールを紹介し、開発現場での適用について解説します。

1986年、イリノイ州警察指紋システムのアセンブリ言語プログラマからスタートして、現在はオブジェクト指向/Javaを中心にコンサルティングと教育を中心に活動する。
共著として、「プログラムの育てかた」(ソフトバンク)、「Spring入門」(技術評論社)、「Spring2.0入門」(技術評論社)がある。http://www.starlight-storm.com

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています