henbeibi

Tuesday, September 26, 2006

ソフトウェアメトリクス解説(002)

Lack of Cohesion in Methods(Henderson-Sellers)
つまり、メソッドの凝集度です。

凝 集度の測定とは、クラスやパッケージ内の機能要素と情報要素間の関連性の高さを測るものです。オブジェクト指向言語において、着目しているクラスに、互い に関連するメンバ変数とメソッドが十分に集まっている、つまり局所化されているのであれば、そのクラスのメンバ変数1つ当たりへアクセスするメソッドの数 は多くなります。

簡単にいってしまうと、メンバ変数1つ当たりへアクセスするメソッドの数が少ないとLCOM*は1へ近づき、多ければLCOM*は0へ近づきます。つまり、LCOM*の値が小さいほど凝集度が高いといえます。

LCOM*は次の式で定義されます:




ここで、

Ajは、着目しているクラスのj番目のメンバ変数

aは、着目しているクラスのメンバ変数の個数

mは、着目しているクラスのメソッドの個数

μ(Aj)は、メンバ変数Ajにアクセスしているメソッドの個数


を表しています。

簡単にいってしまうと、メンバ変数1つ当たりへアクセスするメソッドの数が少ないとLCOM*は1へ近づき、多ければLCOM*は0へ近づきます。つまり、LCOM*の値が小さいほど凝集度が高いといえます。

話を具体的にするためにJavaを想定して説明しましょう。次のようなクラスを考えます。

class SampleClass {
private int a1, a2, a3, a4;

public void m1() {
a1=0; a2=1;
}
public void m2() {
a1=1; a2=2;
}
public void m3() {
a3=0; a4=3;
}
public void m4() {
a3=1; a4=2;
}

このとき、LCOM*の計算式に登場する各項の値は次のとおりです。

a=|A|=メンバ変数の数=4

m=|M|=メソッドの数=4

μ(a1)=a1にアクセスするメソッドの数=2

μ(a2)=a2にアクセスするメソッドの数=2

μ(a3)=a3にアクセスするメソッドの数=2

μ(a4)=a4にアクセスするメソッドの数=2

 よって、このクラスのLCOM*は、

 LCOM*=(((1/4) * (2+2+2+2))ー4)/(1 ? 4)=0.666……

となります。

ここでよく見てみると、{a1, a2, m1, m2}のグループと{a3, a4, m3, m4}のグループは互いに何の関係もないことが分かります。ということは、これらのグループごとにクラスを分けることによって、それぞれのグループの局所化が進み、凝集度が向上するはずです。これらのグループごとにクラスを分割した場合のLCOM*は、それぞれ次のようになります。

クラス1のLCOM*=0

クラス2のLCOM*=0

Labels:

0 Comments:

Post a Comment

<< Home