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