コードクローン 間の依存関係に基づく リファクタリン

コードクローン間の依存関係を利用した
リファクタリング支援手法の提案と実現
井上研究室
博士前期課程 2年
吉田 則裕
2006/2/20
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
1
コードクローンとは
同一,または類似したコード片を持つコード片
 コピー&ペーストなどが原因で生じる
 ソフトウェア保守を困難にする要因の一つ

 コードクローンとなっているコード片の一つを修正すると,他のコード片も
修正の検討を行う必要がある
ソースコード
コード片
ソースコード
コードクローン
コード片
コード片
クローンセット
2006/2/20
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
2
リファクタリング

リファクタリングとは,ソフトウェアの外部的振る舞いを保ったま
まで,内部の構造を改善していく作業 [1]
 重複したコード片(コードクローン)は,優先してリファクタリングす
べき対象
 将来的な修正コストを削減する
コード片
コード片
メソッド
新たに作成したメソッド
呼び出し文
コード片
[1] M. Fowler, Refactoring: improving the design of existing code, Addison
Wesley, 1999.
2006/2/20
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
3
クローンセット間の依存関係 (1/2)

異なるクローンセットに含まれるコード片間に依存関係が存在すると,
リファクタリングが困難な場合がある
親クラス
メソッド1
親クラス
集約
クラスA
クラスB
メソッドa1
メソッドb1
呼出
メソッドa2
2006/2/20
呼出
メソッドb2
クラスA
クラスB
呼出できない
メソッドa2
メソッドb2
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
4
クローンセット間の依存関係(2/2)
呼出先の二つのメソッドもコードクローンであることを利用することにより,
まとめてリファクタリングを行うことが可能
 リファクタリング技術に詳しく,かつコード片間の依存関係を把握した技
術者でなければ,適切にリファクタリングを行うことは困難
 リファクタリング支援が必要

親クラス
親クラス
メソッド1
クラスA
呼出
クラスB
メソッド2
メソッドa1
呼出
メソッドa2
2006/2/20
メソッドb1
呼出
メソッドb2
クラスA
クラスB
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
5
本研究の目的

クローンセット間の依存関係を利用したリファクタリング支援手法を
提案
異なるクローンセットに含まれるコード片間に依存関係がある場合に着目
 そのような依存関係を持つコード片の集合をチェーンドクローンセット として
定義
 チェーンドクローンセットの特徴に応じて,適用可能なリファクタリングパター
ンを提示する手法を提案

チェーンドクローンセット
コード片a1
コード片b1
コード片a2
コード片b2
2006/2/20
リファクタリング
コード片1
コード片2
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
6
チェーンドクローンセットの定義
複数のクローンセットが与えられたとき,コード片を頂点,依存関係を有向辺
とする有向グラフを作成し,連結成分(チェーン)毎に分割する
 このとき,二つの条件が成り立つなら,それらのチェーンは,チェーンドクローン
セットであるという
 各チェーンに含まれる頂点が,互いにコードクローン関係で対応をとること
ができる
 チェーン上で,有向辺(a1, a2)があれば,その他のチェーン上で,a1に対
応するb1,a2に対応するb2からなる有向辺(b1, b2)が存在する

チェーンドクローンセット
呼出
コード片b1
呼出
コード片a2
コード片b2
コード片a1
クローンセット1
クローンセット2
呼出
クローンセット3
2006/2/20
呼出
コード片a3
コード片b3
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
7
チェーンドクローンセットに対するリファクタリング支援

チェーンドクローンセットを,適用可能なリファクタリングパター
ンにより,四種類に分類する
分類1:Extract Method パターンが適用可能
分類2:Pull Up Method パターンが適用可能
分類3:Extract SuperClassパターンが適用可能
分類4:上記3つのリファクタリングパターンが適用不可能

チェーンドクローンセットを特徴に応じて自動的に分類し,
対応するリファクタリングパターンを提示する
2006/2/20
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
8
チェーンドクローンセットの分類
分類 1 : Extract Method パターンが適用可能


特徴
 チェーンドクローンセットが一つのクラスに包含されている
集約方法
 同一のクラス内に全てのコードクローンを集約
リファクタリング後
リファクタリング前
クラスA
クラスA
チェーンドクローンセット
コード片a1
コード片b1
メソッド1
コード片a2
コード片b2
メソッド2
2006/2/20
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
9
チェーンドクローンセットの分類
分類 2 : Pull Up Method パターンが適用可能


特徴
 各チェーンは,それぞれ一つのクラスに包含されている
 チェーンを含んでいる全てのクラスは,共通の親クラスを持つ
集約方法
 全てのコードクローンを共通の親クラスに引き上げる
リファクタリング後
親クラス
リファクタリング前
親クラス
メソッド1
クラスA
クラスB
チェーンドクローンセット
メソッド2
コード片a1
コード片b1
コード片a2
コード片b2
2006/2/20
クラスA
クラスB
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
10
チェーンドクローンセットの自動分類手法
与えられたチェーンドクローンセットに,どのリファクタリングパターンを適用でき
るかメトリクスを用いて判定
 抽出すべき特徴




クローンセットに含まれるコード片間の関係
チェーンに含まれるコード片間の関係
コード片間の関係を三種類に分けて考える



R1:各コード片は同一クラスに所属
R2:各コード片が所属するクラスは同一ではないが,共通の親クラスを持つ
R3:各コード片が所属するクラスは共通の親クラスを持たない
親クラス
2006/2/20
クラスA
クラスB
コード片a1
コード片b1
コード片a2
コード片b2
Pull Up Methodパターンを
適用するためには,クロー
ンセットに含まれるコード辺
間の関係がR2である必要
がある
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
11
メトリクスDCH (the Dispersion of Class Hierarchy)
与えられたコード片群と,その共通の親クラスまでの距離の最
大値を表す[2]
R1:同一クラス
R2: 共通の親クラスを
持つ
R3: 共通の親クラスを
持たない
クラスP
クラスA
クラスB
クラスC
クラスD
クラスE
コード片a1 コード片a2
コード片b
コード片c
コード片d
コード片e
DCH = 0
DCHは1以上の整数
(この例では1)
DCH = ∞
[2] 肥後芳樹, 神谷年洋, 楠本真二, 井上克郎. コードクローンを対象としたリファクタリ
ング支援環境, 電子情報通信学会論文誌D-I, Vol. 88, No. 2, pp. 186–195, 2005.
2006/2/20
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
12
自動分類を目的としたメトリクスの定義


DCHS:クローンセットに含まれるコード片間の関係を表す
DCHD:チェーンに含まれるコード片間の関係を表す
各チェーンに含まれるコード片に対し,それぞれDCHを求め,
その最大値をDCHDとする
DCHD = max{DCH(C1), …, DCH(Cm)}
親クラス
クラスA
クラスB
C1
C2
コード片a1
コード片b1
S1
クローンセットに含まれるコード片
について,それぞれDCHを求め,
その最大値をDCHSとする
コード片a2
コード片b2
S2
DCHS = max{DCH(S1), …, DCH(Sn)}
2006/2/20
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
13
メトリクスによるチェーンドクローンセットの分類
DCHD
DCHS
0
(R1)
0
(R1)
Extract Methodが
適用可能
1以上の整数
(R2)
Pull Up Methodが
適用可能
∞
(R3)
Extract SuperClass
が適用可能
1以上の整数
(R2)
∞
(R3)
いずれのリファクタリングパターンも
適用不可能
DCHS:クローンセットに含まれるコード片間の関係を表す
DCHD:チェーンに含まれるコード片間の関係を表す
2006/2/20
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
14
適用実験
概要
目的
 チェーンドクローンセットの数,規模の調査
 メトリクスを用いてチェーンドクローンセットを分類し,その分類に対
応したリファクタリングパターンを適用できるか確認
 対象
 ANTLR 2.7.4 (4.7万行,285クラス)

 C++, Java, C#用コンパイラ・コンパイラ
 JBoss 3.2.6 (64万行,3364クラス)
 J2EE アプリケーションサーバ

チェーンドクローンセットに基づくリファクタリング支援ツールを作成
 コードクローン検出ツールCCFinderを用いてクローンセットを検出
 それらクローンセットに含まれるコード片間の依存関係を解析し,
チェーンドクローンセットを検出
 定義したメトリクスに基づき,リファクタリングパターンを提示
2006/2/20
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
15
適用実験
チェーンドクローンセットの検出
分類
検出数
コード片数
最大
最小
Extract Method
6
11
4
Pull Up Method
8
120
6
Extract SuperClass
1
4
4
いずれも適用不可能
0
合計
15
全てリファクタリングパターンを適用可能なチェーンドクローンセットであった
 提示されたリファクタリングパターンを用いて,全てのチェーンドクローンセットをリ
ファクタリングできた
 含まれるコード片数が多いチェーンドクローンセットを検出できた
 三つの言語(C++, C#, Java)に対応した部分の多くがコードクローンとなって
いたため

2006/2/20
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
16
適用実験
リファクタリング例:Pull Up Methodパターン
CodeGenerator
CodeGenerator
getValueString
呼出
CSharp
CodeGenerator
Java
CodeGenerator
getValueString
getValueString
呼出
mangleLiteral
呼出
mangleLiteral
リファクタリング前
2006/2/20
mangleLiteral
CSharp
CodeGenerator
Java
CodeGenerator
リファクタリング後
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
17
まとめ

クローンセット間の依存関係を利用したリファクタリング支援
手法を提案
 異なるクローンセットに含まれるコード片間の依存関係に着目
し,チェーンドクローンセットを定義
 チェーンドクローンセットに対する適用可能なリファクタリングパ
ターンを提示するためのメトリクスを定義
 適用実験を通じた妥当性の確認
2006/2/20
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
18
今後の研究方針

開発現場において,チェーンドクローンセットに対するリファク
タリングを行うことにより,保守性を向上できるかの評価

コードクローンに基づくリファクタリング計画立案支援
 大規模ソフトウェアを対象としたリファクタリングでは,ソフトウェ
ア全体を把握することが難しいため,計画の立案が困難
 緻密な計画の立案を行うためには,各パッケージ,クラスに含
まれるコードクローンの傾向を定量的に把握したい
2006/2/20
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
19
アプローチ

ソースコード中の各パッケージ,クラスに含まれるコードクロー
ンの特徴を表すメトリクスを定義
 メトリクスとして表す特徴の例
コードクローンを構成しているコード片の規模の統計的分布
コードクローンを共有している他のパッケージ,クラスの特徴
リファクタリングの効果・コストの統計的分布
2006/2/20
修士論文発表会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
20