スライド 1

リファクタリング支援のための
コードクローンに含まれる識別子の変更内容分析
井上研究室
1
工藤 良介
発表概要
保守コストを抑えるためコードクローンを集約することが
提案されている
全てのコードクローンが集約できるわけではない
集約しやすいクローン,困難なクローンの割合を調査する



2
コードクローンとは

ソースコード中の同一,または類似したコード片

クローンのひとつにバグが見つかった場合,その他のクローンについても
修正を検討する必要がある
クローンとなっている
コード片

3
コードクローンの存在が保守コストを増大させる要因となっている
コードクローンに対するリファクタリング
共通した処理を,単一のコードに集約する

手続きとして独立させる
hoge(){
}
手続き呼出し
に変更
hoge();
hoge();
集約
hoge();
全てのクローンが集約できるとは限らない

4
研究目的・内容
 コードクローンのリファクタリングがどの程度適用できるの
かを確認する
 集約が容易なクローン,集約が困難なクローンの割合を調
べる
 調査対象


5
Java で書かれたオープンソースソフトウェア 2142個
apache.commons,sourceforge.net から収集したもの
本研究で対象とするコードクローン

CCFinder が検出する “Parameterized” クローン
…
int height = getY();
System.out.println(
“Freefall:”);
int time =freefall(height)
…
…
int y = getY();
System.out.println(
“Freefall:”);
int t =freefall(y)
…
変数名が違う
6
…
int y = getHeight();
System.out.println(
“Freefall:”);
int t =freefall(y)
…
手続き名が違う
集約の容易なクローン,困難なクローン
集約の容易なクローン



識別子名に変更のないクローン
変数名のみが変更されているクローン

手続きに引数を設定することで違いを吸収
集約の困難なクローン




7
型名が変更されているクローン
メソッド名が変更されているクローン
識別子の対応が1対1でないクローン
調査手法
ソースコード中のクローンを検出する
ソースコードに出現する識別子のリストを作成
1.
2.

クローン中の識別子をリストから抽出し,対応関係を調
査する
3.


4.
8
出力する情報は{識別子名,出現位置,種類}
変更された識別子の種類
変更された識別子の対応関係
クローンを分類する
調査手法
ソースコード中のクローンを検出する
ソースコードに出現する識別子のリストを作成
1.
2.

クローン中の識別子をリストから抽出し,対応関係を調
査する
3.


4.
9
出力する情報は{識別子名,出現位置,種類}
変更された識別子の種類
変更された識別子の対応関係
クローンを分類する
1.コードクローンの検出

コードクローン検出ツールCCFinderを利用
…
int height = getY();
System.out.println(
“Freefall:”);
int time =freefall(height)
…
…
int y = getY();
System.out.println(
“Freefall:”);
int t =freefall(y)
…
変数名が違う
10
…
int y = getHeight();
System.out.println(
“Freefall:”);
int t =freefall(y)
…
手続き名が違う
調査手法
ソースコード中のクローンを検出する
ソースコードに出現する識別子のリストを作成
1.
2.

出力する情報は{識別子名,出現位置,種類}
クローン中の識別子をリストから抽出し,対応関係を調
査する
3.


4.
11
変更された識別子の種類
変更された識別子の対応関係
クローンを分類する
2.識別子のリスト作成
出力する情報は{識別子名,出現位置,種類}


12
識別子の種類は{変数,メソッド,型,レシーバ,リテラル,その他}
とした
調査手法
ソースコード中のクローンを検出する
ソースコードに出現する識別子のリストを作成
1.
2.

出力する情報は{識別子名,出現位置,種類}
クローン中の識別子をリストから抽出し,対応関係を調
査する
3.


4.
13
変更された識別子の種類
変更された識別子の対応関係
クローンを分類する
3.識別子名の対応関係の調査

識別子名の対応関係を以下のように定義する

変更なし


識別子名は変わっていない
変更あり

1対1対応


N対N対応

14
クローン間で識別子名をお互いに1対1で置換できる
1対1対応ではない識別子名の対応がある
例)識別子の対応関係
A=1;
B=B+A;
D=1;
E=E+D;
H=1;
Y=Z+H;
コード片2
コード片1
コード片3
コード片1
コード片2
コード片3
種類
1対1対応
変更なし
A
D
H
変数
○
×
1
1
1
リテラル
B
E
Y
Z
変数
15
○
×
×
調査手法
ソースコード中のクローンを検出する
ソースコードに出現する識別子のリストを作成
1.
2.

出力する情報は{識別子名,出現位置,種類}
クローン中の識別子をリストから抽出し,対応関係を調
査する
3.


4.
16
変更された識別子の種類
変更された識別子の対応関係
クローンを分類する
4.クローンの分類
コード片1
コード片2
コード片3
種類
1対1対応
変更なし
A
D
H
変数
○
×
1
1
1
リテラル
B
E
Y
Z
変数
○
×
×
このクローンは「変数のみが変更されていて」「1対1でない変更を含む」と分類
変数名A⇔D⇔H
・・・・・・・・ 1対1対応
変数名B⇔E⇔{Y,Z} ・・・・・・・・ N対N対応
17
1対1でない変更があると
集約が難しい
調査する点

集約の容易なクローン



識別子名に変更のないクローン
変数名のみが変わっていてその変更が全て1対1対応である
クローン
集約の困難なクローン



18
型名が変わっているクローン
メソッド名が変わっているクローン
識別子の対応が1対1でないクローン
調査結果

調査対象




Java で書かれたオープンソースソフトウェア 2142個
apache.commons,sourceforge.net から収集したもの
総クローン数 695484
調査結果


19
集約の容易なクローン 26.0%
集約の困難なクローン 52.4%
調査結果
総クローン数 695484
分類
変更なし
変数のみ変更
分類
クローン
数
総クローン数 全ての識別子が1対1対応
に対する割合
156284
22.4%
100%
27634
4.0%
91.2%
クローン数 総クローン数 全ての識別子が1対1対応
に対する割合
型が変更
162622
23.4%
78.3%
メソッドが変更
288419
41.5%
74.0%
型またはメソッドが変更
364005
52.4%
75.5%
集約の期待できるクローン・・・ 26.0%
集約の難しいクローン
・・・ 52.4%
20
考察

集約が容易なクローンが全体の4分の1であった


これらのクローンを集約することで保守コストを下げることが
できる
また,集約が困難なクローンも,その4分の3は識別子が1
対1対応のクローンであった

21
違いを吸収する手法を確立できれば,多くのクローンをリファク
タリングすることができる
まとめ
 コードクローンのリファクタリングがどの程度適用できる
のかを確認するために,集約が容易なクローン,集約が
困難なクローンの割合を調べた
 クローンになっているコード片の間で識別子を比較し,識
別子名の変更状況を調査した
 実験の結果,約4分の1のクローンで集約が容易なことが
わかった
22
38