リファクタリング支援のための
コードクローンに含まれる識別子の変更内容分析
井上研究室
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
© Copyright 2026 ExpyDoc