Download presentation
Presentation is loading. Please wait.
1
リファクタリング支援のための コードクローンに含まれる識別子の変更内容分析 井上研究室 工藤 良介 1
2
発表概要 2 保守コストを抑えるためコードクローンを集約する ことが提案されている 全てのコードクローンが集約できるわけではない 集約しやすいクローン, 困難なクローンの割合を調査 する
3
コードクローンとは 3 ソースコード中の同一, または類似したコード片 クローンのひとつにバグが見つかった場合, その他のクローンについ ても修正を検討する必要がある コードクローンの存在が保守コストを増大させる要因となっている クローンとなっている コード片
4
コードクローンに対するリファクタリング 4 共通した処理を,単一のコードに集約する 全てのクローンが集約できるとは限らない hoge(); 手続きとして独立させ る 手続き呼出し に変更 集約 hoge(){ }
5
研究目的・内容 5 コードクローンのリファクタリングがどの程度適用で きるのかを確認する 集約が容易なクローン,集約が困難なクローンの割合 を調べる 調査対象 Java で書かれたオープンソースソフトウェア 2142 個 apache.commons , sourceforge.net から収集したもの
6
本研究で対象とするコードクローン 6 CCFinder が検出する “Parameterized” クローン … int y = getY(); System.out.println( “Freefall:”); int t =freefall(y) … int height = getY(); System.out.println( “Freefall:”); int time =freefall(height) … int y = getHeight(); System.out.println( “Freefall:”); int t =freefall(y) … 変数名が違う 手続き名が違 う
7
集約の容易なクローン, 困難なクローン 7 集約の容易なクローン 識別子名に変更のないクローン 変数名のみが変更されているクローン 手続きに引数を設定することで違いを吸収 集約の困難なクローン 型名が変更されているクローン メソッド名が変更されているクローン 識別子の対応が 1 対 1 でないクローン
8
調査手法 8 1. ソースコード中のクローンを検出する 2. ソースコードに出現する識別子のリストを作成 出力する情報は { 識別子名, 出現位置, 種類 } 3. クローン中の識別子をリストから抽出し, 対応関係 を調査する 変更された識別子の種類 変更された識別子の対応関係 4. クローンを分類する
9
調査手法 9 1. ソースコード中のクローンを検出する 2. ソースコードに出現する識別子のリストを作成 出力する情報は { 識別子名, 出現位置, 種類 } 3. クローン中の識別子をリストから抽出し, 対応関係 を調査する 変更された識別子の種類 変更された識別子の対応関係 4. クローンを分類する
10
1 .コードクローンの検出 10 コードクローン検出ツール CCFinder を利用 … int y = getY(); System.out.println( “Freefall:”); int t =freefall(y) … int height = getY(); System.out.println( “Freefall:”); int time =freefall(height) … int y = getHeight(); System.out.println( “Freefall:”); int t =freefall(y) … 変数名が違う 手続き名が違 う
11
調査手法 11 1. ソースコード中のクローンを検出する 2. ソースコードに出現する識別子のリストを作成 出力する情報は { 識別子名, 出現位置, 種類 } 3. クローン中の識別子をリストから抽出し, 対応関係 を調査する 変更された識別子の種類 変更された識別子の対応関係 4. クローンを分類する
12
2 .識別子のリスト作成 12 出力する情報は { 識別子名, 出現位置, 種類 } 識別子の種類は { 変数, メソッド, 型, レシーバ, リテラル, そ の他 } とした
13
調査手法 13 1. ソースコード中のクローンを検出する 2. ソースコードに出現する識別子のリストを作成 出力する情報は { 識別子名, 出現位置, 種類 } 3. クローン中の識別子をリストから抽出し, 対応関係 を調査する 変更された識別子の種類 変更された識別子の対応関係 4. クローンを分類する
14
3 .識別子名の対応関係の調査 14 識別子名の対応関係を以下のように定義する 変更なし 識別子名は変わっていない 変更あり 1 対 1 対応 クローン間で識別子名をお互いに 1 対 1 で置換できる N 対 N 対応 1 対 1 対応ではない識別子名の対応がある
15
例)識別子の対応関係 15 A=1; B=B+A; D=1; E=E+D; H=1; Y=Z+H; コード片 1 コード片 2 コード片 3 コード片 1 コード片 2 コード片 3 種類 1 対 1 対応変更なし ADH 変数 ○ × 111 リテラル ○ BEYZYZ 変数 ××
16
調査手法 16 1. ソースコード中のクローンを検出する 2. ソースコードに出現する識別子のリストを作成 出力する情報は { 識別子名, 出現位置, 種類 } 3. クローン中の識別子をリストから抽出し, 対応関係 を調査する 変更された識別子の種類 変更された識別子の対応関係 4. クローンを分類する
17
4 .クローンの分類 17 変数名 A ⇔ D ⇔ H ・・・・・・・・ 1 対 1 対応 変数名 B ⇔ E ⇔{ Y,Z} ・・・・・・・・ N 対 N 対応 1 対 1 でない変更があると 集約が難しい コード片 1 コード片 2 コード片 3 種類 1 対 1 対応変更なし ADH 変数 ○ × 111 リテラル ○ BEYZYZ 変数 ×× このクローンは「変数のみが変更されていて」「 1 対 1 でない変更を含む」と分 類
18
調査する点 18 集約の容易なクローン 識別子名に変更のないクローン 変数名のみが変わっていてその変更が全て 1 対 1 対応であ るクローン 集約の困難なクローン 型名が変わっているクローン メソッド名が変わっているクローン 識別子の対応が 1 対 1 でないクローン
19
調査結果 19 調査対象 Java で書かれたオープンソースソフトウェア 2142 個 apache.commons , sourceforge.net から収集したもの 総クローン数 695484 調査結果 集約の容易なクローン 26.0% 集約の困難なクローン 52.4%
20
調査結果 20 分類クローン 数 総クローン 数に対する 割合 全ての識別子が 1 対 1 対応 変更なし 15628422.4%100% 変数のみ変更 276344.0%91.2% 集約の期待できるクローン・・・ 26.0% 集約の難しいクローン ・・・ 52.4% 分類クローン 数 総クローン 数に対する 割合 全ての識別子が 1 対 1 対応 型が変更 16262223.4%78.3% メソッドが変更 28841941.5%74.0% 型またはメソッドが変 更 36400552.4%75.5% 総クローン数 695484
21
考察 21 集約が容易なクローンが全体の 4 分の 1 であった これらのクローンを集約することで保守コストを下げる ことができる また, 集約が困難なクローンも, その 4 分の 3 は識別子が 1 対 1 対応のクローンであった 違いを吸収する手法を確立できれば, 多くのクローンをリ ファクタリングすることができる
22
まとめ 22 コードクローンのリファクタリングがどの程度適用 できるのかを確認するために, 集約が容易なクローン, 集約が困難なクローンの割合を調べた クローンになっているコード片の間で識別子を比較 し,識別子名の変更状況を調査した 実験の結果, 約 4 分の 1 のクローンで集約が容易なこと がわかった
23
識別子の分類 23 今回識別子を以下のように分類した。 変数 メソッド 型 レシーバ リテラル その他
24
調査結果 24 分類クローン数全体に対する割合 全体 695484 変更なし 15628422.4% 変数のみ変更 276344.0% 型が変更 16262223.4% メソッドが変更 28841941.5% 型またはメソッドが変 更 36400552.4% 分類全ての識別子が 1 対 1 対応 N 対 N 対応を含む 変数のみ変更 91.2%8.8% 集約の期待できるクローン・・・ 26.0% 集約の難しいクローン ・・・ 52.4%
25
実験結果 25 識別子名の変更なしのクローンが全体の 22.4% 、変数 名のみ変更されているクローンが 全体の 4% でその うち 86% が 1 対 1 対応の変更であった 集約の期待されるクローン 型またはメソッド名の変更されたクローンは全体の 52.3% であった 集約の難しいクローン
26
考察 26 全クローンのうち約 4 分の 1 で集約が期待できること がわかった。 提案されているコードクローンのリファクタリング 手法は十分有用であると言える。 しかし、集約可能でも実際には行うべきでないケー スも存在することに留意しなければならない。
27
例)識別子の対応関係 27 a=1; b=b+1; … a=c; a=1; b=b+1; … a=c; a=1; b=b+1; … a=c; 変更なし 1 対 1 対応 a=1; b=b+1; … a=c; d=1; e=e+1; … d=f; g=1; h=h+1; … g=i; a ⇔ d ⇔ g b ⇔ e ⇔ h と 対応 c ⇔ f ⇔ i N 対 N 対応 a=1; b=b+1; … a=c; d=1; f=g+1; … i=c; k=1; f=g+1; … a=l; a ⇔ d,i ⇔ k,a ….. とバラバラ
28
調査結果 28 分類クローン数全体に対する割合 全体 695484 変更なし 15628422.4% 変数のみ変更 276344.0% リテラルのみ変更 405445.8% 型が変更 16262223.4% メソッドが変更 28841941.5% 型またはメソッドが変 更 36400552.4% 分類全ての識別子が 1 対 1 対応 N 対 N 対応を含む 変数のみ変更 85.5%14.5%
29
おわり 29
30
30
31
コードクローンとは (2) 31 コードクローンは 3 つのタイプに分けられる。 タイプ 1 :空白、改行などを除き同一のもの タイプ 2 :変数名や型名など識別子名が変わったもの タイプ 3 :一部に文の挿入や削除が行われたもの 本研究ではタイプ 1 およびタイプ 2 のコードクローン を扱う。
32
コードクローンのリファクタリング (1) 32 コードクローンの存在は保守コストを増大させるの で好ましくない。 コードクローンを除去するためのリファクタリング 手法が提案されている。 リファクタリング:外部からみた動作を変えずに、内部構造を整理する こと
33
背景 ( 非表示 ) 33 Yii Yong Lee の研究で、クローンペア間での識別子名の 変更によるバグの生成についての調査が行われた。 今回は一般化し、バグ検出という視点ではなく、どの ように識別子名の変更が行われているかを調査したい。
34
調査対象 34 Java で書かれたソースファイルを対象とする 研究対象として、以下のドメインから集めたオープ ンソースソフトウェアのデータセットを利用する apache.commons sourceforge.net sourceforge.net.DB ツールの実行対象はプロジェクト単位 全 2142 プロジェクト
35
実験準備 35 実験を行うためにクローン間の識別子の変更内容を 割り出すツールを作成 今回は Java ファイルのみを対象とする
36
実験用ツール概略図 36 Java ファイル CCFinder リスト作成 コードクローン情報識別子リスト 比較 識別子情報
37
実験用ツール 37 クローン検出には既存のツール CCFinder を使用 タイプ 1 および 2 のクローンを検出 クローンとして検出するのは 30 トークン以上のコード片 Java ファイルから識別子を抜き出しリストを作成する プログラムを用意 CCFinder の出力結果と識別子リストの比較により識 別子の変更情報を得る
38
38
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.