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

コードクローン間の依存関係に基づく
リファクタリング支援手法の提案と実現
大阪大学 井上研究室
吉田 則裕
2006/3/31
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
名阪和研究会
1
コードクローンとは
ソースコード中に存在する他のコード片と同一または類似したコード片
 コピー&ペーストなどが原因で生じる
 ソフトウェア保守を困難にする要因の一つ

 コードクローンとなっているコード片の一つを修正すると,他のコード片も修
正の検討を行う必要がある
ソースコード
コード片
ソースコード
コードクローン
コード片
コード片
クローンセット
2006/3/31
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/3/31
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
名阪和研究会
3
コードクローンを対象としたリファクタリング支援

リファクタリングを行うために必要な情報
 リファクタリングの検討が必要なソースコードの位置情報
 適用可能なリファクタリングパターン

これまでに,コードクローンを対象としたリファクタリングに必要な情報を
提示するツールを開発
 コードクローン検出ツールCCFinder[2]
 コードクローンの位置情報を出力
 リファクタリング支援環境Aries[3]
 適用可能なリファクタリングパターンの提示
[2] T. Kamiya, S. Kusumoto, and K. Inoue, “CCFinder: A multi-linguistic token-based code clone detection system for large
scale source code”, IEEE Transactions on Software Engineering, 28(7):654-670, 2002.
[3] 肥後芳樹, 神谷年洋, 楠本真二, 井上克郎. コードクローンを対象としたリファクタリング支援環境, 電子情報通信学会論文誌DI, Vol. 88, No. 2, pp. 186–195, 2005.
2006/3/31
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
名阪和研究会
4
リファクタリング支援環境Aries

各クローンセットに対して,個別にリファクタリング支援を行う
 リファクタリングパターンの決定支援を目的としたメトリクスを提示
 コードクローンの検出に,CCFinderを利用
NRV
NSV
DCH
パターン
コード片b1
0
0
∞
Extract Method
コード片b2
1
0
1
Pull Up Method
1
0
∞
Extract Method
クローンセット1
コード片a1
クローンセット2
コード片a2
クローンセット3
コード片a3
コード片b3
2006/3/31
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
名阪和研究会
5
クローンセット間の依存関係 (1/2)
異なるクローンセットに含まれるコード片間に依存関係が存在
各クローンセットに対して,個別にリファクタリングを行うことが困難

親クラス
メソッド1
親クラス
集約
クラスA
クラスB
メソッドa1
メソッドb1
呼出
メソッドa2
呼出
メソッドb2
クラスA
クラスB
呼出できない
メソッドa2
メソッドb2
2006/3/31
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
名阪和研究会
6
クローンセット間の依存関係(2/2)
呼出先の二つのメソッドもコードクローンであることを利用することにより,
まとめてリファクタリングを行うことが可能
 リファクタリング技術に詳しく,かつコード片間の依存関係を把握した技
術者でなければ,適切にリファクタリングを行うことは困難
 リファクタリング支援が必要

親クラス
親クラス
メソッド1
クラスA
呼出
クラスB
メソッド2
メソッドa1
呼出
メソッドa2
メソッドb1
呼出
メソッドb2
クラスA
クラスB
2006/3/31
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
名阪和研究会
7
本研究の目的

クローンセット間の依存関係を利用したリファクタリング支援手法を
提案
異なるクローンセットに含まれるコード片間に依存関係がある場合に着目
 そのような依存関係を持つコード片の集合をチェーンドクローンセット として
定義
 チェーンドクローンセットの特徴に応じて,適用可能なリファクタリングパター
ンを提示する手法を提案

チェーンドクローンセット
コード片a1
コード片b1
コード片a2
コード片b2
リファクタリング
コード片1
コード片2
2006/3/31
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
名阪和研究会
8
チェーンドクローンセットの定義
複数のクローンセットが与えられたとき,コード片を頂点,依存関係を有向辺
とする有向グラフを作成し,連結成分(チェーン)毎に分割する
 このとき,二つの条件が成り立つなら,それらのチェーンは,チェーンドクローン
セットであるという
 各チェーンに含まれる頂点が,互いにコードクローン関係で対応をとること
ができる
 チェーン上で,有向辺 Ea =(a1, a2)があれば,その他のチェーン上で,
a1に対応するb1,a2に対応するb2からなる有向辺 Eb = (b1, b2)が
存在する

チェーンドクローンセット
呼出
コード片b1
呼出
コード片a2
コード片b2
コード片a1
クローンセット1
クローンセット2
呼出
クローンセット3
呼出
コード片a3
コード片b3
2006/3/31
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
名阪和研究会
9
チェーンドクローンセットに対するリファクタリング支援

チェーンドクローンセットを,適用可能なリファクタリングパター
ンにより,四種類に分類する
分類1:Extract Method パターンが適用可能
分類2:Pull Up Method パターンが適用可能
分類3:Extract SuperClassパターンが適用可能
分類4:上記3つのリファクタリングパターンが適用不可能

チェーンドクローンセットを特徴に応じて自動的に分類し,
対応するリファクタリングパターンを提示する
2006/3/31
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
名阪和研究会
10
チェーンドクローンセットの分類
分類 1 : Extract Method パターンが適用可能


特徴
 チェーンドクローンセットが一つのクラスに包含されている
集約方法
 同一のクラス内に全てのコードクローンを集約
リファクタリング後
リファクタリング前
クラスA
クラスA
チェーンドクローンセット
コード片a1
コード片b1
メソッド1
コード片a2
コード片b2
メソッド2
2006/3/31
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
名阪和研究会
11
チェーンドクローンセットの分類
分類 2 : Pull Up Method パターンが適用可能


特徴
 各チェーンは,それぞれ一つのクラスに包含されている
 チェーンを含んでいる全てのクラスは,共通の親クラスを持つ
集約方法
 全てのコードクローンを共通の親クラスに引き上げる
リファクタリング後
親クラス
リファクタリング前
親クラス
メソッド1
クラスA
クラスB
チェーンドクローンセット
メソッド2
コード片a1
コード片b1
コード片a2
コード片b2
クラスA
クラスB
2006/3/31
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
名阪和研究会
12
チェーンドクローンセットの分類
分類 3 : Extract SuperClassパターンが適用可能

特徴



各チェーンは,それぞれ一つのクラスに包含されている
チェーンを含んでいる全てのクラスは,共通の親クラスを持たない
集約方法

新たに共通の親クラスを作成して,そのクラスに2つのコードクローンを引き上げる
リファクタリング後
リファクタリング前
新たに作成した親クラス
クラスA
クラスB
メソッド1
チェーンドクローンセット
コード片a1
コード片b1
コード片a2
コード片b2
メソッド2
クラスA
クラスB
2006/3/31
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
名阪和研究会
13
チェーンドクローンセットの分類
分類 4 前述した3つのリファクタリングパターンを適用不可能

特徴

各チェーンが,それぞれ複数のクラス間にまたがっている
クラス S1
クラス S2
チェーンドクローンセット
クラス A
クラス B
クラス C
クラス D
コード片a
コード片b
コード片c
コード片d
前述した3つのリファクタリングパターンを適用できない
(個々のコードクローンとして,リファクタリングすることはできる)
2006/3/31
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
名阪和研究会
14
チェーンドクローンセットの自動分類手法
与えられたチェーンドクローンセットに,どのリファクタリングパターンを適用でき
るかメトリクスを用いて判定
 抽出すべき特徴




クローンセットに含まれるコード片間の関係
チェーンに含まれるコード片間の関係
コード片間の関係を三種類に分けて考える



R1:各コード片は同一クラスに所属
R2:各コード片が所属するクラスは同一ではないが,共通の親クラスを持つ
R3:各コード片が所属するクラスは共通の親クラスを持たない
親クラス
2006/3/31
クラス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
名阪和研究会
15
メトリクスDCH (the Dispersion of Class Hierarchy)
与えられたコード片群と,その共通の親クラスまでの距離の最
大値を表す[3]
R1:同一クラス
R2: 共通の親クラスを
持つ
R3: 共通の親クラスを
持たない
クラスP
クラスA
クラスB
クラスC
クラスD
クラスE
コード片a1 コード片a2
コード片b
コード片c
コード片d
コード片e
DCH = 0
DCHは1以上の整数
(この例では1)
DCH = ∞
[3] 肥後芳樹, 神谷年洋, 楠本真二, 井上克郎. コードクローンを対象としたリファクタリ
ング支援環境, 電子情報通信学会論文誌D-I, Vol. 88, No. 2, pp. 186–195, 2005.
2006/3/31
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
名阪和研究会
16
自動分類を目的としたメトリクスの定義


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/3/31
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
名阪和研究会
17
メトリクスによるチェーンドクローンセットの分類
DCHD
DCHS
0
(R1)
0
(R1)
Extract Methodが
適用可能
1以上の整数
(R2)
Pull Up Methodが
適用可能
∞
(R3)
Extract SuperClass
が適用可能
1以上の整数
(R2)
∞
(R3)
いずれのリファクタリングパターンも
適用不可能
DCHS:クローンセットに含まれるコード片間の関係を表す
DCHD:チェーンに含まれるコード片間の関係を表す
2006/3/31
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
名阪和研究会
18
適用実験
概要


目的
 チェーンドクローンセットの数,規模の調査
 メトリクスを用いてチェーンドクローンセットを分類し,その分類に対応したリファクタ
リングパターンを適用できるか確認
対象
 ANTLR 2.7.4 (4.7万行,285クラス)
 C++, Java, C#用コンパイラ・コンパイラ

JBoss 3.2.6 (64万行,3364クラス)
 J2EE アプリケーションサーバ

チェーンドクローンセットに基づくリファクタリング支援ツールを作成
 コードクローン検出ツールCCFinderを用いてクローンセットを検出
 それらクローンセットに含まれるコード片間の依存関係を解析し,チェーンドクロー
ンセットを検出
 定義したメトリクスに基づき,リファクタリングパターンを提示
2006/3/31
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
名阪和研究会
19
適用実験
チェーンドクローンセットの検出(ANTLR 2.7.4)
分類
検出数
コード片数
最大
最小
Extract Method
6
11
4
Pull Up Method
8
120
6
Extract SuperClass
1
4
4
いずれも適用不可能
0
合計
15
全てリファクタリングパターンを適用可能なチェーンドクローンセットであった
 提示されたリファクタリングパターンを用いて,全てのチェーンドクローンセットをリ
ファクタリングできた
 含まれるコード片数が多いチェーンドクローンセットを検出できた
 三つの言語(C++, C#, Java)に対応した部分の多くがコードクローンとなって
いたため

2006/3/31
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
名阪和研究会
20
適用実験
チェーンドクローンセットの検出(JBoss 3.2.6)
分類
検出数
コード片数
最大
Extract Method
52
37
4
Pull Up Method
45
35
6
Extract SuperClass
36
29
4
いずれも適用不可能
8
65
4
合計

最小
141
ANTLRと比較して,Extract SuperClassパターンが適用可能なチェーンド
クローンが多い
パッケージ内に複数のソフトウェアを含むため,ソフトウェア間のコードクローンが
存在するため
2006/3/31
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
名阪和研究会
21
適用実験
リファクタリング例:Pull Up Methodパターン
CodeGenerator
CodeGenerator
getValueString
呼出
CSharp
CodeGenerator
Java
CodeGenerator
getValueString
getValueString
呼出
mangleLiteral
mangleLiteral
呼出
mangleLiteral
リファクタリング前
CSharp
CodeGenerator
Java
CodeGenerator
リファクタリング後
2006/3/31
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
名阪和研究会
22
まとめ

クローンセット間の依存関係を利用したリファクタリング支援
手法を提案
 異なるクローンセットに含まれるコード片間の依存関係に着目
し,チェーンドクローンセットを定義
 チェーンドクローンセットに対する適用可能なリファクタリングパ
ターンを提示するためのメトリクスを定義
 適用実験を通じた妥当性の確認

今後の課題
 開発現場において,チェーンドクローンセットに対するリファクタ
リングを行うことにより,保守性を向上できるかの評価
2006/3/31
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
名阪和研究会
23