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

コードクローン間の依存関係に基づく
リファクタリング支援手法の提案と実現
吉田則裕1) 肥後芳樹1) 神谷年洋2) 楠本真二1) 井上克郎1)
1⁾大阪大学
2005/06/06
大学院情報科学研究科
2⁾産業技術総合研究所
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
1
背景(1)コードクローンとは

ソースコード中に存在する同一,または類似したコード片
 コピー&ペーストなどによる,プログラム再利用などが原因で生じる

ソフトウェア保守を困難にする要因の一つ
コードクローン
2005/06/06
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
2
背景(2)コードクローンへの対策


コードクローンの集約(リファクタリング)
リファクタリングとは,ソフトウェアの外部的振る舞いを保ったままで,
内部の構造を改善していく作業


重複したコード片(コードクローン)は、最も優先してリファクタリングすべ
き[1]
将来的な修正コストの削減
新たに作成したメソッド
呼び出し文
[1] M. Fowler, Refactoring: improving the design of existing code, Addison Wesley,
1999.
2005/06/06
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
3
本研究の動機

依存関係のあるメソッドの集合がコードクローンとなっている場合がある
集約
(リファクタリング)
コードクローンA
コードクローンB
コードクローンC
2005/06/06
メソッドa1
メソッドb1
メソッドc1
メソッドa2
メソッドb2
メソッドc2
メソッドa
集約
(リファクタリング)
集約
(リファクタリング)
メソッドb
メソッドc
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
4
本研究の動機

依存関係のあるメソッドの集合がコードクローンとなっている場合がある
まとめてリファクタリングする方が効果的である
メソッドa1
メソッドa
メソッドa2
集約
2005/06/06
メソッドb1
メソッドb2
メソッドb
メソッドc1
メソッドc2
メソッドc
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
5
本研究の目的


コードクローンとなっている依存関係のあるメソッドの集合を
Chained Cloneとして定義する
Chained Cloneに対するリファクタリング支援手法を提案する
Chained Clone
2005/06/06
メソッドa1
メソッドa2
メソッドb1
メソッドb2
メソッドc1
メソッドc2
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
6
Chained Cloneの定義

Chained Method


CM2
G1
G2
依存関係のあるメソッドの集合
Chained Clone

与えられた2つのChained Method CM1
とCM2から依存関係を表す有向グラフG1,
G2を作ったときに以下の条件が成り立つも
の
1. G1とG2は同形グラフである
2. G1とG2において対応する頂点(メソッド)は
互いにクローンである

CM1
Chained Clone Set

2005/06/06
Chained Cloneの同値類
頂点がメソッド,
有向辺が依存関係,
同色の頂点が互いに
クローンとなっている
メソッド
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
7
対象とする依存関係


メソッドの呼び出し関係
同一変数の使用(参照・代入)
•メソッドの呼び出し関係
メソッドa1
•同一変数の使用
メソッドa2
Call
メソッドb1
メソッドb2
使用
使用
変数α
Call
メソッドc1
2005/06/06
メソッドc2
使用
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
8
Chained Clone に対するリファクタリング

Chained Cloneを集約するリファクタリングパターンとして以下のものを
利用する
 Pull
Up Method
 Extract Method
 Extract Super Class

Chained Cloneを特徴に応じて,4種類に分類し,適切なリファクタリ
ングパターンを適用する
2005/06/06
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
9
Chained Cloneの分類
Case 1 (同一のクラスに包含されている場合)

同一のクラスに包含されている
リファクタリング後
リファクタリング前
クラスA
クラスA
Chained Clone
メソッドa11
メソッドa12
メソッドa1
メソッドa21
メソッドa22
メソッドa2
同一のクラス内に全てのメソッドを集約可能
(Extract Methodパターンを適用)
2005/06/06
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
10
Chained Cloneの分類
Case 2 (複数のクラスにまたがっており,共通の親クラスを持つ場合)


互いにクローンとなっているメソッドが複数のクラスにまたがっており,共通の親クラスを持つ
各Chained Methodは,それぞれ同一のクラスに含まれている
リファクタリング後
リファクタリング前
親クラス
親クラス
メソッド1
クラスA
クラスB
Chained Clone
メソッドa1
メソッドb1
メソッドa2
メソッドb2
メソッド2
クラスA
クラスB
全てのクローンを共通の親クラスに引き上げることができる
(Pull Up Methodパターンの適用)
2005/06/06
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
11
Chained Cloneの分類
Case 3(複数のクラスにまたがっており,共通の親クラスを持たない場合)


互いにクローンとなっているメソッドが複数のクラスにまたがっており,共通の親クラスを持たない
各Chained Methodは,それぞれ同一のクラスに含まれている
リファクタリング前
リファクタリング後
新たに作成した親クラス
クラスA
クラスB
メソッド1
Chained Clone
メソッドa1
メソッドb1
メソッドa2
メソッドb2
メソッド2
クラスA
クラスB
新たに共通の親クラスを作成して,全てのクローンをそのクラスに引き上げることがで
きる.(Extract Super Class パターンの適用)
2005/06/06
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
12
Chained Cloneの分類
Case 4 (Chained Methodが複数のクラスにまたがっている場合)

含まれるChained Methodが複数のクラスにまたがっている
Chained Clone
クラスA
クラスB
メソッドa
メソッドb
クラスC
クラスD
メソッドc
メソッドd
Chained Clone単位でリファクタリングすることは困難
(個々のコードクローンとして,リファクタリングできる場合はある)
2005/06/06
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
13
Chained Cloneの自動分類手法

方針
 与えられたChained
Cloneが,Case1~Case4のいずれに該当するか
をメトリクスを用いて決定する

抽出すべき特徴
(1)互いにクローンとなっているメソッドが同一クラス内に存在するか,もしく
は共通の親クラスを持つか
(2)含まれるChained Methodが同一クラス内に存在するか,もしくは共
通の親クラスを持つか
2005/06/06
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
14
メトリクスDCH (the Dispersion of Class Hierarchy)
与えられたメソッド群の共通の親クラスまでの距離の最大値を表す
•DCH = 2
•例:DCH= 1
クラスS1
クラスS1
クラスS2
1
クラスA
メソッドa
2
クラスB
メソッドb
クラスA
クラスB
クラスC
メソッドa
メソッドb
メソッドc
(注)与えられたメソッド群が共通の親クラスをもたない場合は未定義
DCHにより,与えられたメソッド群が同一クラス内に存在するか,もしくは共通の
親クラスを持つかを判断できる
2005/06/06
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
15
提案するメトリクス


DCHS:互いにクローンとなっているメソッドが同一クラス内に存在するか,もしくは共
通の親クラスを持つか
DCHD:Chained Methodに含まれる各メソッドが同一クラス内に存在するか,もし
くは共通の親クラスを持つか
各Chained Methodを構成しているメソッドに対し,
それぞれDCHを求め,その最大値をDCHDとする
メソッドa1
2005/06/06
メソッドa2
メソッドb1
メソッドb2
メソッドc1
メソッドc2
互いにクローンとなっている
メソッドについて,それぞれ
DCHを求め,その最大値
DCHSとする
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
16
メトリクスによるChained Cloneの分類
分類
DCHS
DCHD
Case 1
0
0
Case 2
1以上
0
Case 3
-
0
Any
1以上
or
-
Case 4
2005/06/06
意味
同一のクラスに包含されている.
複数のクラス間にまたがっており,かつ共通の親クラスを持つ.
更に,各Chained Methodはそれぞれ同一のクラスに含まれている.
複数のクラス間にまたがっており,かつ共通の親クラスを持たない.
更に,各Chained Methodはそれぞれ同一のクラスに含まれている.
含まれるChained Methodが複数のクラスにまたがっている.
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
17
適用実験
概要

目的
 実際のソフトウェアにおけるChained
Cloneの数,規模の調査
 メトリクスを用いてChained Cloneを分類し,その分類に対応したリファク
タリングパターンを適用できるか

対象
 オープンソースプロジェクト
 ANTLR 2.7.4( 4.7万行,285クラス )
 C++, Java, C#用コンパイラ・コンパイラ
 JBoss 3.2.6 ( 64万行,3364クラス )
 J2EE アプリケーションサーバ
 商用ソフトウェア
 X( 8万行,308クラス )
 Y( 32万行, 289クラス )
2005/06/06
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
18
適用実験
Chained Cloneの検出(オープンソースプロジェクト)

ANTLR 2.7.4
分類
検出数

メソッド数
最大
分類
検出数
最小
メソッド数
最大
Case 1
3
4
4
Case 2
6
40
6
Case 3
1
4
4
Case 4
合計
適
用
可
能
最小
Case 1
16
13
4
Case 2
17
8
4
Case 3
13
29
4
0
Case 4
4
44
6
10
合計
50
含まれるメソッド数が多いChained
Cloneがある
3つの言語に対応した部分の多くが
クローンとなっていたため
2005/06/06
JBoss 3.2.6
ANTLRと比較してCase 3が多い
パッケージ内に複数のソフトウェアを
含むため,ソフトウェア間のクローンが
存在するため
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
19
適用実験
Chained Cloneの検出(商用ソフトウェア)

X

分類
検出数
メソッド数
最大
Y
分類
検出数
最大
最小
Case 1
2
Case 2
0
0
Case 3
7
Case 4
0
Case 4
0
合計
9
合計
9
Case 1
0
Case 2
9
Case 3
14
メソッド数
4
最小
13
13
26
4
Case 2のみが存在
Case 3が多い
共通の部品クラスを継承したクラス
間にコードクローンが存在するため.
主に,データベースへのデータを追加,
更新,削除等の処理
ユーティリティクラスを集めたパッ
ケージが2つあり,それらのパッケージ
間でコードクローンが存在するため
2005/06/06
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
20
適用実験
リファクタリング例(1):Case 2(ANTLR)
Pull Up Method
reference
CodeGenerator
grammer
reference
CodeGenerator
grammer
reference
reference
getValueString
call
CSharp
CodeGenerator
Java
CodeGenerator
getValueString
getValueString
call
mangleLiteral
call
mangleLiteral
リファクタリング前
2005/06/06
mangleLiteral
CSharp
CodeGenerator
Java
CodeGenerator
リファクタリング後
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
21
適用実験
リファクタリング例(2):Case 3(ANTLR)
Extract Super Class
GeneralCharFormatter
escapeString
call
CSharp
CharFormatter
Java
CharFormatter
escapeString
escapeString
call
escapeChar
call
escapeChar
リファクタリング前
2005/06/06
escapeChar
CSharp
CharFormatter
Java
CharFormatter
リファクタリング後
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
22
まとめ

依存関係のあるメソッドの集合がコードクローンとなっている
ものをリファクタリングする手法を提案
 Chained
Cloneの定義
 適切なリファクタリングパターンを提示するためのメトリクスを提
案
 適用実験を通じた有効性の確認

今後の課題
 メソッド以外のコード片への応用
2005/06/06
ソフトウェア信頼性研究会
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
23