2. メソッド抽出を必要とする兆候
メソッド抽出の必要性を評価するソフトウェアメトリックスの提案
三宅達也†

肥後 芳樹†（正員）

井上克郎†（正員）出がある [2]．メソッド抽出とはメソッド内のコードの一部を新規メソッドとして抽出するリファクタリングである．以下では，メソッド抽出の必要性を示す既存

A Software Metric for Identifying Extract Method Candidates
Tatsuya MIYAKE† , Nonmember, Yoshiki HIGO† ,and Katsuro INOUE† , Members†

典型的なリファクタリング作業の一つにメソッド抽の不吉な匂いと，それを定量的に表すソフトウェアメトリックスに関して述べる．
［長すぎるメソッド］ 長すぎるメソッドはメソッド抽

大阪大学大学院情報科学研究科，吹田市

Graduate School of Information and Science Technology,

出を行うことにより，短くすることが望ましい [2]．メOsaka University, Suita-shi, 565–0871 Japan

ソッドを短くすることにより，可読性や再利用性が向上する．このため，メソッドの行数を表すソフトウェ

あらまし リファクタリングはソフトウェアの設計アメトリックスである LOC (Lines Of Code) が大き品質を改善するための有効な技術である．しかし，どいメソッドはメソッド抽出の候補であるといえる．のようなときにリファクタリングが要求されるかを判［制御フローの複雑なメソッド］ 制御フローの複雑な断するのは容易ではない．そこで，本論文ではメソッメソッドもメソッド抽出の候補である．MaCabe は制ド抽出リファクタリングを行う必要のあるメソッドの御フローの複雑さを表すソフトウェアメトリックスと候補を自動的に識別するためのソフトウェアメトリッしてサイクロマチック数（以降，CYC）を提案していクスを提案する．また，定性的な評価や適用事例を通る [5]．この値は直観的にはソースコード上の分岐の数して，提案メトリックスを用いることにより，既存のに 1 を加えた数を表し，値が大きいほどそのメソッドメトリックスでは識別できないメソッド抽出リファクの制御フローは複雑であるといえる．経験的に CYCタリングの対象を識別できることを示した．

は 10 以下に抑えることが望ましいといわれている [5]．

キーワード リファクタリング，ソフトウェアメトリックス［凝集度の低いメソッド］ 凝集度はモジュール内の構成要素が特定の機能を実現するため協調している度合

1. ま え が きを表す．メソッドの凝集度を表すメトリックスにはプ

リファクタリングとはソフトウェアの外部的振舞い

ログラムスライスを用いる手法が提案されている [6]．

を保ったまま，ソフトウェアの内部構造を改善するここのメトリックスが低いメソッドはプログラムスライとによりソフトウェアの設計品質を高める技術であスを用いたメソッド抽出の候補である [4]．凝集度は七る [2]．しかし，どのようなときにリファクタリングつのレベルに分けることができ，通常，メソッドの凝が要求されるかについての厳密な基準は存在しない．

集度は最も高いレベルであることが望ましい [7]．プ

Fowler は過去の経験や知識をもとにリファクタリング

ログラムスライスを用いたメトリックスはそのうちのが要求される可能性を示すいくつかの兆候（不吉な匂下位四つを凝集度の低いモジュール（メソッド抽出のい）を定義している [2]．また，それらの不吉な匂いの候補）として識別できるが，最上位（機能的凝集）よ

いくつかはモジュールの行数やサイクロマチック数なり低い二つのレベル（逐次的・通信的凝集）にあるモ

どの複雑度メトリックスを用いて定量的に示すことがジュールを識別することができない場合が多い．これできる．しかし，本来モジュールは行数や複雑さではは出力変数（返り値やメソッド内で変更される属性ななく，機能に基づいて分割することが望ましい．

ど）のみに着目してメトリックスが計測されるためでモジュールの機能はモジュール内の構成要素が協調しあって実現される．本論文ではメソッドの構成要素ある．

3. 提案メトリックス：COBの協調度合に着目することにより，メソッド抽出リファ

オブジェクト指向には，処理（機能要素）及び処理クタリングを必要とするメソッドの候補を自動的に識に必要なデータ（データ要素）を一つにまとめるとい別するための新しいメトリックスを提案する．また適う重要な考え方がある．同様に，機能要素が必要とし用事例を用いて既存のメトリックスとの比較を行い，ないデータ要素は互いに分離しておくことが望まし

提案メトリックスの有効性に関して議論する．

い．この考えに基づき構成されたモジュールは機能要
素とデータ要素が互いに協調しており，凝集度が高く

電子情報通信学会論文誌

c （社）電子情報通信学会 2009
D Vol. J92–D No. 7 pp. 1071–1073 1071

電子情報通信学会論文誌 2009/7 Vol. J92–D No. 7

協調している．一方，BLOCK1，2 で構成されるコード片と BLOCK3，4 で構成されるコード片は協調していない．このとき COB の値は 0.5 となる．変数 v4の使用を変数 v1 の使用に置き換えたとき，図 1 (c) のようにすべてのコードブロックが変数 v1 を介して協調するため，COB の値は 0.66 に上昇する．更に，変数 v3 と使用を変数 v2 の使用に置き換えると全変数が全コードブロックで使用され COB は最大値 1 となる．
ここで，呼出し関係にある二つのメソッドについて考える．一方のメソッド内のローカル変数は基本的にもう一方のメソッドからはアクセスできない．引数を利用してアクセスすることは可能であるが，二つのメソッドが適切に切り分けられているとき引数の数は少
図 1 サンプルコード
Fig. 1 A sample code.

なくなる傾向がある．このため，適切に切り分けられた二つのメソッドを一つにまとめたとき，メソッド内の要素の協調状況は図 1 (b) と似たものになり，COBなる．クラスの場合，その度合を表すメトリックスとは低くなる．このことから，COB の低いメソッドはして LCOM が提案されている [1], [3]．LCOM は属性メソッド抽出を行い，二つに分割すべきメソッドの候をデータ要素，メソッドを機能要素とみなし，その協補であるといえる．
既存のメトリックスと比べ，COB は次の利点をもつ．

調度合を表す．
本論文では，メソッドの構成要素の協調度合を示すため，メソッド内で使用されている変数をデータ要素，コードブロックを機能要素とみなし，ソフトウェアメ
トリックス COB (Cohesion Of Blocks) を次のよう•メソッド内の要素の協調度合を表すため，LOCや CYC より機能に基づいた評価が行える．

•

LOC や CYC と異なり適切にメソッド抽出した場合の方が，もとのメソッドと新規メソッドのメに定義する．b はメソッド内のコードブロックの数，v

トリックス値が高くなる．例えば，図 1 (b) においてはメソッド内で使用されている変数の数，Vj はメソッ

BLOCK1 と BLOCK3 をメソッド抽出しても COB

ド内で使用されている j 番目の変数，µ(Vj ) は変数 Vjは変化しないが，BLOCK1 と BLOCK2 をメソッドを使用しているコードブロックの数を示す．

抽出した場合は上昇する．

11
µ(Vj ) (0 ≤ COB ≤ 1)
bvv

COB =jCOB は LCOM* [3] と同様に，特定のデータ要素と協調する機能要素の割合の平均に着目している．

•

出力変数だけでなくすべての変数に着目するため，逐次的・通信的凝集が機能的凝集よりもメトリッ
クス値が低くなる傾向がある．

4. 適 用 事 例
既存のソフトウェア (apache-ant-1.7.0) に対して

図 1 (a) の sample メソッドコードを用いて COB

COB，LOC（空白・コメントを含む），CYC を計測

計測の例を示す．sample メソッド内の BLOCK1-4 はし，それぞれのメトリックスごとに，メトリックス値コードブロックを示す．また，図 1 (b) は sample メの大きさでソートし，上位 20 メソッドをメソッド抽ソッドの構成要素であるコードブロックと使用されて出の候補として検出した．

いる変数の協調関係を抽象化した図である．図 1 (b)計測の結果，COB でソートした場合は 0.066 以下，において四角はコードブロックを，四角内の円はそのLOC の場合は 146 以上，CYC の場合は 22 以上のメ

コードブロック内で使用されている変数を，点線は二トリックス値をもつメソッドがメソッド抽出の候補とつのコードブロックが変数を介して協調していることして検出された．検出されたメソッドのうち COB でを意味する．図 1 (b) から分かるように，sample メソートした場合のみ検出された六つのメソッドを表 1

ソッドは BLOCK1 と BLOCK2 は変数 v1，v2 を介に示す．六つのメソッドをメソッド名やコードコメンして協調している．同様に BLOCK3 と BLOCK4 もトをもとに調査した結果，JUnitTestRunner#main

1072

レター

表 1

COB を用いた場合のみメソッド抽出の候補となる
メソッド
Table 1 Extract method candidates identified only
by COB.

片はバイナリーデータとして入力の正当性検証を，

メソッド名
DirectoryScanner#scan
ModifiedSelector#configure
Parallel#spinThreads
JUnitTestRunner#main
Concat#validate
MacroDef#sameOrSiminlarのメソッドに分割することが適切であると判断できた．

COB
0.066
0.065
0.065
0.0650.060
0.055

LOC641151361068955

CYC
121817192016

38〜89 行のコード片はソースコードとして入力の正当性検証を行っていることが分かり，38 行を境に二つ

5. む す び
本論文では，メソッド抽出の候補を識別するために，メソッド内の構成要素の協調度合を示すソフトウェア
メトリックス COB を提案した．適用事例では COBを用いることにより，LOC や CYC などでは識別できないメソッド抽出の候補を識別できることを示した．
また，COB はスライスベースの凝集度メトリックスとは異なる要素に着目して協調度合を評価しているため，両方のメトリックスを用いることにより，機能に基づいたメソッド抽出候補の検出を多角的に行うことができると考えられる．
今後の課題としては，より多くのソフトウェアに対して適用することにより，より定量的に有効性を評価する必要がある．
謝辞 本研究は一部，文部科学省「次世代 IT 基盤構築のための研究開発」（研究開発領域名：ソフトウェ
ア構築状況の可視化技術の開発普及）の委託に基づいて行われた．
文献

図 2 COB を用いて検出されたメソッド抽出候補の例
Fig. 2 An example of extract method candidates
identified by COB.

[1]

メソッド以外のメソッドはメソッド抽出の対象として[2]

M. Fowlor, Refactoring: Improving the design of ex-

適当であると判断できた．JUnitTestRunner#main[3]

B. Henderson-Sellors, Object-Oriented Metrics: Mea-

[4]

J. Krinke, “Statement-level cohesion metrics andS. Chidamber and C. Kemerer, “A metric suite forobject-oriented design,” IEEE Trans. Softw. Eng.,
vol.25, no.5, pp.476–493, June 1994.
isting code, Addison Wesley, 1999.

メソッドに関してはコードコメントが存在しなかったため評価を控えた．

sures of Complexity, Prentice Hall, 1996.
their visualization,” Proc. 7th International Working

図 2 にメソッド抽出候補の例としてメソッド Con-

Conference on Source Code Analysis and Manipula-cat#validate の概略を示す．このメソッドは 6〜37 行の範囲に含まれるコードブロック群内では 10 個の変数

tion, pp.37–48, Sept. 2007.
[5]

T. McCabe, “A complexity measure,” IEEE Trans.

[6]

L.M. Ott and J.J. Thuss, “Slice-based metrics for es-が，38〜89 行の範囲に含まれるコードブロック群では14 個の変数が使用されていたが，6〜37 行と 38〜89

Softw. Eng., vol.2, no.4, pp.308–320, Dec. 1976.
timating cohesion,” Proc. 1st International Software

行の両方の範囲内で使用されている変数は 2 個であった．つまり，片方の範囲で使用されている変数のほとんどがもう片方では使用されておらず，互いに協調していなかった．このため，COB が減少し，メソッド抽出の候補として検出された．また，このメソッドはMetrics Symposium, pp.71–81, 1993.
[7]

W. Stevens, G. Myers, and L. Constantine, “Structured design,” IBM Syst. J., vol.13, no.2, pp.115–139,
1974.

（平成 21 年 2 月 6 日受付）

6 行と 38 行のコードコメントから，6〜37 行のコード1073