コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現 大阪大学 井上研究室 吉田 則裕 2006/3/31 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 1 コードクローンとは ソースコード中に存在する他のコード片と同一または類似したコード片 コピー&ペーストなどが原因で生じる ソフトウェア保守を困難にする要因の一つ コードクローンとなっているコード片の一つを修正すると,他のコード片も修 正の検討を行う必要がある ソースコード コード片 ソースコード コードクローン コード片 コード片 クローンセット 2006/3/31 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 2 リファクタリング リファクタリングとは,ソフトウェアの外部的振る舞いを保ったま まで,内部の構造を改善していく作業 [1] 重複したコード片(コードクローン)は,優先してリファクタリングす べき対象 将来的な修正コストを削減する コード片 コード片 メソッド 新たに作成したメソッド 呼び出し文 コード片 [1] M. Fowler, Refactoring: improving the design of existing code, Addison Wesley, 1999. 2006/3/31 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 3 コードクローンを対象としたリファクタリング支援 リファクタリングを行うために必要な情報 リファクタリングの検討が必要なソースコードの位置情報 適用可能なリファクタリングパターン これまでに,コードクローンを対象としたリファクタリングに必要な情報を 提示するツールを開発 コードクローン検出ツールCCFinder[2] コードクローンの位置情報を出力 リファクタリング支援環境Aries[3] 適用可能なリファクタリングパターンの提示 [2] T. Kamiya, S. Kusumoto, and K. Inoue, “CCFinder: A multi-linguistic token-based code clone detection system for large scale source code”, IEEE Transactions on Software Engineering, 28(7):654-670, 2002. [3] 肥後芳樹, 神谷年洋, 楠本真二, 井上克郎. コードクローンを対象としたリファクタリング支援環境, 電子情報通信学会論文誌DI, Vol. 88, No. 2, pp. 186–195, 2005. 2006/3/31 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 4 リファクタリング支援環境Aries 各クローンセットに対して,個別にリファクタリング支援を行う リファクタリングパターンの決定支援を目的としたメトリクスを提示 コードクローンの検出に,CCFinderを利用 NRV NSV DCH パターン コード片b1 0 0 ∞ Extract Method コード片b2 1 0 1 Pull Up Method 1 0 ∞ Extract Method クローンセット1 コード片a1 クローンセット2 コード片a2 クローンセット3 コード片a3 コード片b3 2006/3/31 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 5 クローンセット間の依存関係 (1/2) 異なるクローンセットに含まれるコード片間に依存関係が存在 各クローンセットに対して,個別にリファクタリングを行うことが困難 親クラス メソッド1 親クラス 集約 クラスA クラスB メソッドa1 メソッドb1 呼出 メソッドa2 呼出 メソッドb2 クラスA クラスB 呼出できない メソッドa2 メソッドb2 2006/3/31 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 6 クローンセット間の依存関係(2/2) 呼出先の二つのメソッドもコードクローンであることを利用することにより, まとめてリファクタリングを行うことが可能 リファクタリング技術に詳しく,かつコード片間の依存関係を把握した技 術者でなければ,適切にリファクタリングを行うことは困難 リファクタリング支援が必要 親クラス 親クラス メソッド1 クラスA 呼出 クラスB メソッド2 メソッドa1 呼出 メソッドa2 メソッドb1 呼出 メソッドb2 クラスA クラスB 2006/3/31 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 7 本研究の目的 クローンセット間の依存関係を利用したリファクタリング支援手法を 提案 異なるクローンセットに含まれるコード片間に依存関係がある場合に着目 そのような依存関係を持つコード片の集合をチェーンドクローンセット として 定義 チェーンドクローンセットの特徴に応じて,適用可能なリファクタリングパター ンを提示する手法を提案 チェーンドクローンセット コード片a1 コード片b1 コード片a2 コード片b2 リファクタリング コード片1 コード片2 2006/3/31 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 8 チェーンドクローンセットの定義 複数のクローンセットが与えられたとき,コード片を頂点,依存関係を有向辺 とする有向グラフを作成し,連結成分(チェーン)毎に分割する このとき,二つの条件が成り立つなら,それらのチェーンは,チェーンドクローン セットであるという 各チェーンに含まれる頂点が,互いにコードクローン関係で対応をとること ができる チェーン上で,有向辺 Ea =(a1, a2)があれば,その他のチェーン上で, a1に対応するb1,a2に対応するb2からなる有向辺 Eb = (b1, b2)が 存在する チェーンドクローンセット 呼出 コード片b1 呼出 コード片a2 コード片b2 コード片a1 クローンセット1 クローンセット2 呼出 クローンセット3 呼出 コード片a3 コード片b3 2006/3/31 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 9 チェーンドクローンセットに対するリファクタリング支援 チェーンドクローンセットを,適用可能なリファクタリングパター ンにより,四種類に分類する 分類1:Extract Method パターンが適用可能 分類2:Pull Up Method パターンが適用可能 分類3:Extract SuperClassパターンが適用可能 分類4:上記3つのリファクタリングパターンが適用不可能 チェーンドクローンセットを特徴に応じて自動的に分類し, 対応するリファクタリングパターンを提示する 2006/3/31 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 10 チェーンドクローンセットの分類 分類 1 : Extract Method パターンが適用可能 特徴 チェーンドクローンセットが一つのクラスに包含されている 集約方法 同一のクラス内に全てのコードクローンを集約 リファクタリング後 リファクタリング前 クラスA クラスA チェーンドクローンセット コード片a1 コード片b1 メソッド1 コード片a2 コード片b2 メソッド2 2006/3/31 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 11 チェーンドクローンセットの分類 分類 2 : Pull Up Method パターンが適用可能 特徴 各チェーンは,それぞれ一つのクラスに包含されている チェーンを含んでいる全てのクラスは,共通の親クラスを持つ 集約方法 全てのコードクローンを共通の親クラスに引き上げる リファクタリング後 親クラス リファクタリング前 親クラス メソッド1 クラスA クラスB チェーンドクローンセット メソッド2 コード片a1 コード片b1 コード片a2 コード片b2 クラスA クラスB 2006/3/31 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 12 チェーンドクローンセットの分類 分類 3 : Extract SuperClassパターンが適用可能 特徴 各チェーンは,それぞれ一つのクラスに包含されている チェーンを含んでいる全てのクラスは,共通の親クラスを持たない 集約方法 新たに共通の親クラスを作成して,そのクラスに2つのコードクローンを引き上げる リファクタリング後 リファクタリング前 新たに作成した親クラス クラスA クラスB メソッド1 チェーンドクローンセット コード片a1 コード片b1 コード片a2 コード片b2 メソッド2 クラスA クラスB 2006/3/31 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 13 チェーンドクローンセットの分類 分類 4 前述した3つのリファクタリングパターンを適用不可能 特徴 各チェーンが,それぞれ複数のクラス間にまたがっている クラス S1 クラス S2 チェーンドクローンセット クラス A クラス B クラス C クラス D コード片a コード片b コード片c コード片d 前述した3つのリファクタリングパターンを適用できない (個々のコードクローンとして,リファクタリングすることはできる) 2006/3/31 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 14 チェーンドクローンセットの自動分類手法 与えられたチェーンドクローンセットに,どのリファクタリングパターンを適用でき るかメトリクスを用いて判定 抽出すべき特徴 クローンセットに含まれるコード片間の関係 チェーンに含まれるコード片間の関係 コード片間の関係を三種類に分けて考える R1:各コード片は同一クラスに所属 R2:各コード片が所属するクラスは同一ではないが,共通の親クラスを持つ R3:各コード片が所属するクラスは共通の親クラスを持たない 親クラス 2006/3/31 クラスA クラスB コード片a1 コード片b1 コード片a2 コード片b2 Pull Up Methodパターンを 適用するためには,クロー ンセットに含まれるコード辺 間の関係がR2である必要 がある Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 15 メトリクスDCH (the Dispersion of Class Hierarchy) 与えられたコード片群と,その共通の親クラスまでの距離の最 大値を表す[3] R1:同一クラス R2: 共通の親クラスを 持つ R3: 共通の親クラスを 持たない クラスP クラスA クラスB クラスC クラスD クラスE コード片a1 コード片a2 コード片b コード片c コード片d コード片e DCH = 0 DCHは1以上の整数 (この例では1) DCH = ∞ [3] 肥後芳樹, 神谷年洋, 楠本真二, 井上克郎. コードクローンを対象としたリファクタリ ング支援環境, 電子情報通信学会論文誌D-I, Vol. 88, No. 2, pp. 186–195, 2005. 2006/3/31 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 16 自動分類を目的としたメトリクスの定義 DCHS:クローンセットに含まれるコード片間の関係を表す DCHD:チェーンに含まれるコード片間の関係を表す 各チェーンに含まれるコード片に対し,それぞれDCHを求め, その最大値をDCHDとする DCHD = max{DCH(C1), …, DCH(Cm)} 親クラス クラスA クラスB C1 C2 コード片a1 コード片b1 S1 クローンセットに含まれるコード片 について,それぞれDCHを求め, その最大値をDCHSとする コード片a2 コード片b2 S2 DCHS = max{DCH(S1), …, DCH(Sn)} 2006/3/31 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 17 メトリクスによるチェーンドクローンセットの分類 DCHD DCHS 0 (R1) 0 (R1) Extract Methodが 適用可能 1以上の整数 (R2) Pull Up Methodが 適用可能 ∞ (R3) Extract SuperClass が適用可能 1以上の整数 (R2) ∞ (R3) いずれのリファクタリングパターンも 適用不可能 DCHS:クローンセットに含まれるコード片間の関係を表す DCHD:チェーンに含まれるコード片間の関係を表す 2006/3/31 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 18 適用実験 概要 目的 チェーンドクローンセットの数,規模の調査 メトリクスを用いてチェーンドクローンセットを分類し,その分類に対応したリファクタ リングパターンを適用できるか確認 対象 ANTLR 2.7.4 (4.7万行,285クラス) C++, Java, C#用コンパイラ・コンパイラ JBoss 3.2.6 (64万行,3364クラス) J2EE アプリケーションサーバ チェーンドクローンセットに基づくリファクタリング支援ツールを作成 コードクローン検出ツールCCFinderを用いてクローンセットを検出 それらクローンセットに含まれるコード片間の依存関係を解析し,チェーンドクロー ンセットを検出 定義したメトリクスに基づき,リファクタリングパターンを提示 2006/3/31 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 19 適用実験 チェーンドクローンセットの検出(ANTLR 2.7.4) 分類 検出数 コード片数 最大 最小 Extract Method 6 11 4 Pull Up Method 8 120 6 Extract SuperClass 1 4 4 いずれも適用不可能 0 合計 15 全てリファクタリングパターンを適用可能なチェーンドクローンセットであった 提示されたリファクタリングパターンを用いて,全てのチェーンドクローンセットをリ ファクタリングできた 含まれるコード片数が多いチェーンドクローンセットを検出できた 三つの言語(C++, C#, Java)に対応した部分の多くがコードクローンとなって いたため 2006/3/31 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 20 適用実験 チェーンドクローンセットの検出(JBoss 3.2.6) 分類 検出数 コード片数 最大 Extract Method 52 37 4 Pull Up Method 45 35 6 Extract SuperClass 36 29 4 いずれも適用不可能 8 65 4 合計 最小 141 ANTLRと比較して,Extract SuperClassパターンが適用可能なチェーンド クローンが多い パッケージ内に複数のソフトウェアを含むため,ソフトウェア間のコードクローンが 存在するため 2006/3/31 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 21 適用実験 リファクタリング例:Pull Up Methodパターン CodeGenerator CodeGenerator getValueString 呼出 CSharp CodeGenerator Java CodeGenerator getValueString getValueString 呼出 mangleLiteral mangleLiteral 呼出 mangleLiteral リファクタリング前 CSharp CodeGenerator Java CodeGenerator リファクタリング後 2006/3/31 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 22 まとめ クローンセット間の依存関係を利用したリファクタリング支援 手法を提案 異なるクローンセットに含まれるコード片間の依存関係に着目 し,チェーンドクローンセットを定義 チェーンドクローンセットに対する適用可能なリファクタリングパ ターンを提示するためのメトリクスを定義 適用実験を通じた妥当性の確認 今後の課題 開発現場において,チェーンドクローンセットに対するリファクタ リングを行うことにより,保守性を向上できるかの評価 2006/3/31 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 名阪和研究会 23
© Copyright 2025 ExpyDoc