インタフェース継承を考慮したメトリックスが見つけられなかったので、古典を復習することで考えることにした。リファクタリングって非工学的な手法なんですね。このペースで行くと生産性までたどり着くにはいつになるやら。
[生産性]実装(詳細設計)の相対的評価のためのCKメトリックス
以下のメトリックスを使うことによって、クラスおよびメソッドのレビューを定量的に行える。これはクラス図に対してもソースコードに対しても計測可能なメトリックスである。「不吉な匂いを嗅ぎ分ける」などと属人的なことは止めて、このような定量的データに基づいてリファクタリングを行うべきである。JMetricというツールが計測してくれる(2000/5から更新されていない)。ただし、インタフェース継承について考慮していない。
- クラス当たりの重みづけられたメソッド数(WMC:Weight Methods per Class)
クラスにおける重みをつけたメソッド数(重みはメソッドの種類によってつける)を 計測することで、クラスの複雑度を示す。数値が大きいほど、クラスは複雑であり、保守が難しくなる。また、数値が大きい場合は、正しく責任の分割が行われていない可能性があり、再利用がしにくくなる。このようなクラスが存在する場合は、オブジェクト指向ではなく手続き的な可能性がないかと設計を疑う必要がある。
以下にLorenzによる重みを示す。
APIコール 5.0 パラメタつきメソッド 3.0 二項式、算術演算 2.0 単項式 1.0 代入 0.5 ネスト式 0.5 一時変数 0.5 パラメタ 0.3
- 継承の深さ(DIT:Depth of Inheritance Tree)
あるクラスのスーパークラス数を計測することで、他のクラスから影響度を示す。DITが高いほど、継承されている変数やメソッドが多いことを示す。サブクラス化による継承は強い依存関係を生むので、継承が深ければ深いほど、そのクラスに影響を与えるクラスが多く存在し、そのクラスが持つメソッドが多くなり、そのクラスの保守が難しくなる。システム全体の平均値から、DITが低ければそのシステムがあまり継承を使用せず、DITが高ければシステムが継承を多用していると判断できる。
- 直下のサブクラス数(NOC:Number of Children)
あるクラスのサブクラス数を計測することで、他のクラスへの影響度を示す。NOCが高いほど、サブクラスへの影響が強いので、保守が難しくなる。また、直下のサブクラスが非常に多い場合は、正しく抽象化できていない場合がある。
- オブジェクト間の結合度(CBO:Coupling between Object)
あるクラスに関係しているクラス数を計測することで、クラス間の影響度を示す。CBOが高い(オブジェクト間の結合度が高い)ほど、他のクラスに依存し、保守が難しくなる。
- クラスが呼び出せるメソッドの総和(RFC:Response for a Class)
あるクラスに関係しているメッセージ数を計測することで、クラスの複雑度を示す。RFCが大きいほど、送信しなければならないメッセージ数が多いことを示し、 保守が難しくなる。また、RFCが1(つまり、継承がまったくなく、そのクラスに1つだけしかメソッドのないクラス)のクラスが多い場合は、責務が正しく分割されていない場合がある。WMCが各メソッドの複雑さの総和であるのに対して、RFCは単純にメソッド数である。ただし、RFCは継承によるメソッドの総和のため、RFCが高い場合は、深い継承や継承元のクラスに多数のメソッドがあると推定できる。
- メソッドの凝集度の欠如(LCOM:Lack of Cohesion in Methods)
メソッドの凝集度を計測すること(計測式については野中君がまとめている。http://www.azuma.mgmt.waseda.ac.jp/~nonaka/metrics/LCOM.html)で、メソッドの強度を示す。LCOM が小さいほど凝集性が高く、メソッドの強度が高い。 反対にLCOMが大きいほど変数を共有している部分が多いことを示し、 保守が難しくなる。
参考文献
1)Chidamber, C.Kemerer, A Metrics Suite for Object Oriented Design., IEEE Transactions on Software Engineering, Vol. 20 Number 6, pp.476-493 1994
2)Mark Lorenz, Jeff Kidd,オブジェクト指向ソフトウェアメトリクス、プレンティスホール、1995(Object-Oriented Software Metrics, Prentice Hall,1994)
3)Shyam R. Chidamber , Chris F. Kemerer, Towards a Metrics Suite for Object Oriented Design, OOPSLA'91 Proceedings, pp.197-211, 1991.