スライド 1

CKメトリクスを用いてリファクタリングの
効果を予測する手法の提案
井上研究室
博士前期課程2年
松本義弘
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
1
研究の背景

将来的なソフトウェアの保守コストの削減を目的に,リファク
タリング[1]と呼ばれる技術が研究されている
 リファクタリングとは?
ソフトウェアの外部的振る舞いを保ったまま,内部の構造を改善する
技術
 リファクタリングの効果は?
ソフトウェアの保守性が向上する

リファクタリングを実施するプロセスで,その効果を予測したい
という要求がある
[1] M. Fowler, Refactoring: improving the design of existing code, Addison Wesley,
1999.
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
2
研究対象と目的

一般的に使われるリファクタリングプロセス[2]
フェーズ1: どこにリファクタリングを適用すべきか決定する
フェーズ2: どのようなリファクタリングを適用すべきかを決定する
フェーズ3: リファクタリングの効果を予測する
フェーズ4: プログラムを修正する
フェーズ5: プログラムが正しく動作するかテストする
[2] T Mens and T. Tourwé. A survey of software refactoring. IEEE Trans. Softw.
Eng., 30(2):126–139, 2004.
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
3
関連研究

リファクタリング位置特定/選択手法
 構造的な欠陥(低凝集・高結合のクラスなど)を発見し,それに
対して効果的なリファクタリングを提案[3]

リファクタリングの効果計測手法
 高結合を解消するリファクタリングを,独自に定義した結合度メ
トリクスに基づいて定量的に評価する[4]
[3]秦野, 乃村, 谷口, 牛島. ソフトウェアメトリクスを利用したリファクタリングの自動化支
援機構. 情報処理学会論文誌,44(6):1548–1557, Jun 2003.
[4]Y. Kataoka. T. Imai, H.Andou and T. Fukaya, A quantitative evaluation of
maintainability enhancement by refactoring., In ICSM ’02, p. 576-585, 2002.
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
4
研究の概要

関連研究の問題
 リファクタリングは,高結合・低凝集なクラスだけが対象ではない
 「計算処理を行うクラスに画面描画の機能の一部が実装されているので適
切なクラスに移動したい」
 このようなケースにおいても,リファクタリングを評価する必要がある
 リファクタリング適用支援ツールを使っても,ソースコードの修正はコストが
かかる
 ソースコードを修正する前に,ソフトウェアの保守性に与える効果を知るべき

研究目的
 ソースコードを修正する前に,リファクタリングが保守性に与える効果を予
測する手法を提案・実装し,有用性を評価する
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
5
ソフトウェアの保守性

「機能仕様の変更や追加に対する修正のしやすさ」を表す

ソフトウェアの保守性を評価するためにソフトウェア複雑度メ
トリクスが用いられている[4].
 メトリクスが高く複雑であればあるほど修正のコストがかかり,保守
が困難であると評価されている

代表的なソフトウェア複雑度メトリクスとして,CKメトリクスが
あげられる
[4] 神谷年洋, オブジェクト指向メトリクスを用いた開発支援法に関する研究, PhD thesis,
大阪大学大学院基礎工学研究科, 2001.
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
6
CKメトリクス

CKメトリクスは以下の3つの観点からクラスの複雑さを評価
する
継承
DIT (Depth of inheritance tree)
NOC (Number of children)
結合
RFC(Response for a class)
CBO(Coupling between object-class)
クラスの
内部複雑度
WMC(Weighted methods per class)
LCOM(Lack of cohesion in method)
※これらのメトリクスは,値が高いほどクラスが複雑であることを表す
本研究では,CK メトリクスを用いてリファクタリングがソ
フトウェアの保守性に与える効果を予測する手法を提案

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
7
提案手法の概要
STEP1
プログラム解析
ユーザ
解析情報α
STEP2
リファクタリング箇所
とパターンを取得
STEP3
CK Metricsα
STEP4
解析情報α’
CK Metricsα’
リファクタリング前後のメトリ
クスの変化率の計算
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
8
STEP1:対象プログラムの解析

対象プログラムの解析を行い,CKメトリクスを計測する
ソフトウェアを構成する全クラス
解析情報
D
B
A
C
・クラス間の参照関係
・メソッド間の参照関係
・メソッドとフィールドの参照関係
・メソッド内の分岐・繰り返しの数
など
E
F
G
CKメトリクス計測
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
9
STEP2:リファクタリング箇所とリファクタリン
グパターンの入力

リファクタリングしたい箇所(フィールド,メソッド,クラス)を指
定し,適用したいリファクタリングパターンを与える
 実装しているリファクタリングパターン
 フィールドの移動
 フィールドの引き上げ
 フィールドの引き下げ
 メソッドの移動
 メソッドの引き上げ
 メソッドの引き下げ
 クラスの抽出
 スーパークラスの抽出
 サブクラスの抽出
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
10
STEP3:解析情報の修正(1)

STEP2を元に解析情報を修正する
 例:クラスAのメソッドa1()をクラスBへ移動
(1)リファクタリングの影響を受けるクラスを検出する
(2)ユーザ非依存部分の修正
(3)ユーザ依存部分の修正
D
クラス
A
メソッド
a1()
a2()
B
Fan-in
クラス
メソッド
B
b1()
C
c1()
D
d1()
・・・
・・・
d1( )
call a1( )
A
b1( )
call a1( )
a1( )
a2( )
C
call a1( )
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
c1( )
11
STEP3:解析情報の修正(2)

STEP2を元に解析情報を修正する
 例:クラスAのメソッドa1をクラスBへ移動
(1)リファクタリングの影響を受けるクラスを検出する
(2)ユーザ非依存部分の修正
(3)ユーザ依存部分の修正
クラス
A
メソッド
クラス
a1()
B
a2()
メソッド
b1()
a1()
メソッドb1()
Offset
10
命令
~
(ClassA)instA.a1()
D
d1( )
B
call a1( )
A
b1( )
a1( )
call a1( )
a1( )
a2( )
C
call a1( )
c1( )
(ClassB)a1()
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
12
STEP3:解析情報の修正(3)

STEP2を元に解析情報を修正する
 例:クラスAのメソッドA1をクラスBへ移動
(1)リファクタリングの影響を受けるクラスを検出する
(2)ユーザ非依存部分の修正
(3)ユーザ依存部分の修正
メソッドd1()
Offset
命令
~
20
(ClassA)instA.a1()
(ClassB)???.a1()
D
d1( )
B
call a1( )
a1()
b1()
A
a2( )
call a1( )
どのインスタンスに対して
呼び出すのか?
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
C
c1( )
13
STEP4:CKメトリクスの計算


修正後の解析情報を元にCKメトリクスを計測
CKメトリクスの変化があったクラスに対し,メトリクスの変化率を計算
ソフトウェアを構成するクラス群
D’
D
B
A
B
B’
A
A’
F
F
C’
E
F
G
変化があったクラスのCKメトリクス
WMC
CBO
・・・
DIT
A’
B’
C’
D’
合計
xx
xx
xx
xx
xx
xx
xx
xx
xx
xx
・・・
・・・
・・・
・・・
・・・
xx
xx
xx
xx
xx
変化率
xx
xx
・・・
xx
WMCの変化率=
SUMWMC(A’, B’, C’, D’)- SUMWMC(A, B, C, D)
SUMWMC(A, B, C, D)
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
14
適用実験の概要

適用実験の対象

GUI
Feature Location Visualizer(以下,FLV)
 クラス数:37
CL
 行数:4815行
GVP
BP
FLGVV
ExtractPanel ep;
setExtractPanel()
setStartClass()

問題点


CP
GUIの処理と無関係なComponentList(CL)クラスにGUIの処理の一部が実装さ
れている
改善案

そのフィールドとメソッドを以下のいずれかのクラスに移動する
 case1: FeatureLocationGraphVisualizationViewer(FLGVV)クラス
 case2: BirdPanel(BP)クラス
 case3: ComponentPanel(CP)クラス
 case4: GraphViewPanel(GVP)クラス
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
15
適用実験の結果(case1)
表1.case1の結果
クラス名 WMC LCOM NOC DIT CBO
RFC
CL
10(-2)
62
0
1 8(-1) 36(-2)
FLGVV
21(+2)
1
0
1
12 71(+3)
EP
5
0
0
1 13(-1)
83
合計
36(±0)
63
0
3 33(-2) 190(+1)
変化率
0.00% 0.00% 0.00% 0.00% -5.71%
0.53%
「フィールド,メソッドの移動」は,継承の変化を伴わないのでNOC,DITは変
化しない
 LCOMは,getter/setterは省いて計測する仕様を採用したため,値に変化
がなかった.
 WMC,CBO,RFCは変化が見られた.
 WMC:変化なし
 CBO:減少
 RFC:微量な変化

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
16
適用実験の結果
case1
case2
case3
case4
WMC
0.00%
0.00%
0.00%
0.00%
CBO
-1.90%
1.67%
3.03%
0.60%
R FC
 case1~4で,メトリクスの変化
0.18%
率をクラス数で正規化し,それぞ
0.09%
れを比較
0.40%
0.00%
 WMCは変化なし
 RFCは微量な変化
4.00%

3.00%
case1

2.00%
WMC
1.00%
CBO
RFC
0.00%
case1
-1.00%
case2
case3
case4

リファクタリング後のCBOの値は減
少し,一番良い結果が得られた
case2,3,4

リファクタリング後のCBOは増加し
てしまった
-2.00%
-3.00%
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
17
考察
case1
case2
case3
case4

WMC
0.00%
0.00%
0.00%
0.00%
CBO
-1.90%
1.67%
3.03%
0.60%
R FC
0.18%
0.09%
0.40%
0.00%
開発者の主観でリファクタリングを行うと,case2,3,4のようなリファクタリン
グを適用する可能性があり,ソフトウェアが構造的に悪化する危険があ
る
 本手法を用いて比較することは重要である

本手法では,リファクタリング前後のメトリクスの値だけでリファクタリングを
評価している
 より正確に評価するためには,ソースコード修正にかかるコストやテストにか
かるコストも考慮するべき
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
18
まとめ

まとめ
 リファクタリングがソフトウェアの保守性に与える効果を予測する手法を
提案した.
 その手法の適用実験を行い,有用性を評価した.

今後の課題
 「クラスのインライン化」など,構造的な変化を伴う未実装なリファクタリン
グに関しても実装したい
 ソースコード修正にかかるコスト,テストにかかるコストを考慮し,手法を
改良したい
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
19