ソフトウェア・メトリックス


良い設計モデルの作り方(後編)

ソフトウェア・メトリックス

WMC - Weight Methods per Class

定義:各クラスの全メソッドの複雑さの総和

メソッド自体の「複雑度」というのは、上記の論文の中では明示的に定義していません。それは、メソッド自体の複雑性自体は従来のメトリックスにより測定可能と考えられているためで、通常よく使われるものとしては、T. McCabe?による「CC - Cyclomatic Complexity」や、単純にメソッドのパラメータの数を複雑度とするもののメソッドの中で、送られるメッセージの数に重みを付けて測定する方法などがあります

CC補足

  • メソッド単位の概念
  • Linearな部分を数える。
  • テストのカバレッジを上げるのが大変。
  • 心理的な負担も大きい

DIT - Depth of Inheritance Tree

定義:それぞれのクラスにおける継承度の深さ

継承によりプログラムを再利用することは有用なのですが、継承は最も強い依存関係を生みます。従って、継承が深ければ深いほど、そのクラスに影響を与えるクラスが多く存在することになります。また、継承が深いほど、そのクラスが持つメソッドが多くなり(上位のメソッドを受け継ぐため)、そのクラスを理解することが難しくなります。

NOC - Number of Children

定義:それぞれのクラス直下のサブ・クラス(チャイルド・クラス)の数

直系のサブ・クラスが非常に多い場合は、抽象化が正しく行われていない可能性もあります。また、NOCが高いということは、そのクラスを再利用しているクラスが多いというわけなので、そのクラスのテストが煩雑になる傾向があります

CBO - Coupling between Object Classes

定義:それぞれのクラスと結合しているクラスの総和

結合しているクラスとは、ターゲットのクラスが、属性、パラメータ、戻り値、例外、ローカル変数として使用している型と、その型の属性やメソッドの呼び出しで使用されている型を含みます。また、この総和の中には、同一の型は1回のみカウントされ、継承元のクラスやプリミティブ型は含まれません。


RFC - Response for a Class

定義:それぞれのクラスに対して呼び出し可能なメソッドの総和

RFCは継承によるメソッドの総和になるため、継承関係が深いものや、継承元のクラスに多数メソッドがある場合、そのクラスのRFCは高くなります。

LCOM - Lack of Cohesion in Methods

オブジェクト指向言語において、着目しているクラスに、互いに関連するメンバ変数とメソッドが十分に集まっている、つまり局所化されているのであれば、そのクラスのメンバ変数1つ当たりへアクセスするメソッドの数は多くなります。その点に着目したメトリクスの1つがLCOM*(Lack of Cohesion in Methods)です

定義:それぞれのクラスにおける、属性によるメソッドの不同性(凝集度の欠如)

 少し難しいいい回しですが、つまり「それぞれのメソッドが、いかに均等にそれぞれの属性にアクセスしているか?」ということです。詳細は述べませんが、LCOMにはこの論文で定義されている測定方法以外に、Brian Henderson-Sellersによる『Object-Oriented Metrics: Measures of Complexity』(Prentice Hall, 1995)で、この論文のLCOMの欠点を補う形で発表されています。

 例えば、特定のセットの属性は特定のメソッドの中でアクセスされ、その他の属性は、その他のメソッドでのみアクセスされている場合は、そのクラスを複数のクラスに分割することが可能ということになります。また、こういったクラスは、クラスの責任分割の段階でうまく分割されていない可能性もあります。

結合度

結合度の測定方法とは、クラスの中に定義されている型の種類の数を数えます。具体的には、継承クラス、インターフェイス、メンバ属性、メソッドのパラメータなどです。型の数が多いとほかのクラスやパッケージ間の依存関係が分散し過ぎていると判断できます。

これらのメトリックスの基本的な考え方

  • それぞれのクラスが正しく責任を分担しているか?
  • 個々のクラスが複雑過ぎる構成になっていないか?
  • それぞれのクラスの関連が複雑になっていないか?

追加

  • NOL
    • Number Of Levels。メソッド中のネストの深さ
    • 深いネストは理解しづらく、複雑
    • 'if/else if' もネスト。インデントと一致する概念ではない
  • NOP
    • Number Of Parameters
    • メソッド中のパラメータ数。モデルからクラスが抜け落ちている可能性
    • クラスを抽出することで凝集度もあがる
  • NOS
    • Number Of Statements
    • メソッド中の命令数。LOCより良いだろう
    • break, continue, do, explicit constructor call, explicit super constructor call, for, if, return, switch, throw, try, catch, finally, while, assignments. method calls, pre/post increment/decrement等を数える
  • Ce
    • Efferent Couplings
    • クラスが知っている型の数
    • 知っているべき型の安定性に依存するので、壊れやすい
  • NOF
    • Number Of Fields
    • メソッド中のフィールド数
    • NOPと似た概念かな。クラスを抽出することで凝集度もあがる