コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現 吉田則裕1) 肥後芳樹1) 神谷年洋2) 楠本真二1) 井上克郎1) 1⁾大阪大学 2005/06/06 大学院情報科学研究科 2⁾産業技術総合研究所 ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 1 背景(1)コードクローンとは ソースコード中に存在する同一,または類似したコード片 コピー&ペーストなどによる,プログラム再利用などが原因で生じる ソフトウェア保守を困難にする要因の一つ コードクローン 2005/06/06 ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 2 背景(2)コードクローンへの対策 コードクローンの集約(リファクタリング) リファクタリングとは,ソフトウェアの外部的振る舞いを保ったままで, 内部の構造を改善していく作業 重複したコード片(コードクローン)は、最も優先してリファクタリングすべ き[1] 将来的な修正コストの削減 新たに作成したメソッド 呼び出し文 [1] M. Fowler, Refactoring: improving the design of existing code, Addison Wesley, 1999. 2005/06/06 ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 3 本研究の動機 依存関係のあるメソッドの集合がコードクローンとなっている場合がある 集約 (リファクタリング) コードクローンA コードクローンB コードクローンC 2005/06/06 メソッドa1 メソッドb1 メソッドc1 メソッドa2 メソッドb2 メソッドc2 メソッドa 集約 (リファクタリング) 集約 (リファクタリング) メソッドb メソッドc ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 4 本研究の動機 依存関係のあるメソッドの集合がコードクローンとなっている場合がある まとめてリファクタリングする方が効果的である メソッドa1 メソッドa メソッドa2 集約 2005/06/06 メソッドb1 メソッドb2 メソッドb メソッドc1 メソッドc2 メソッドc ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 5 本研究の目的 コードクローンとなっている依存関係のあるメソッドの集合を Chained Cloneとして定義する Chained Cloneに対するリファクタリング支援手法を提案する Chained Clone 2005/06/06 メソッドa1 メソッドa2 メソッドb1 メソッドb2 メソッドc1 メソッドc2 ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 6 Chained Cloneの定義 Chained Method CM2 G1 G2 依存関係のあるメソッドの集合 Chained Clone 与えられた2つのChained Method CM1 とCM2から依存関係を表す有向グラフG1, G2を作ったときに以下の条件が成り立つも の 1. G1とG2は同形グラフである 2. G1とG2において対応する頂点(メソッド)は 互いにクローンである CM1 Chained Clone Set 2005/06/06 Chained Cloneの同値類 頂点がメソッド, 有向辺が依存関係, 同色の頂点が互いに クローンとなっている メソッド ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 7 対象とする依存関係 メソッドの呼び出し関係 同一変数の使用(参照・代入) •メソッドの呼び出し関係 メソッドa1 •同一変数の使用 メソッドa2 Call メソッドb1 メソッドb2 使用 使用 変数α Call メソッドc1 2005/06/06 メソッドc2 使用 ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 8 Chained Clone に対するリファクタリング Chained Cloneを集約するリファクタリングパターンとして以下のものを 利用する Pull Up Method Extract Method Extract Super Class Chained Cloneを特徴に応じて,4種類に分類し,適切なリファクタリ ングパターンを適用する 2005/06/06 ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 9 Chained Cloneの分類 Case 1 (同一のクラスに包含されている場合) 同一のクラスに包含されている リファクタリング後 リファクタリング前 クラスA クラスA Chained Clone メソッドa11 メソッドa12 メソッドa1 メソッドa21 メソッドa22 メソッドa2 同一のクラス内に全てのメソッドを集約可能 (Extract Methodパターンを適用) 2005/06/06 ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 10 Chained Cloneの分類 Case 2 (複数のクラスにまたがっており,共通の親クラスを持つ場合) 互いにクローンとなっているメソッドが複数のクラスにまたがっており,共通の親クラスを持つ 各Chained Methodは,それぞれ同一のクラスに含まれている リファクタリング後 リファクタリング前 親クラス 親クラス メソッド1 クラスA クラスB Chained Clone メソッドa1 メソッドb1 メソッドa2 メソッドb2 メソッド2 クラスA クラスB 全てのクローンを共通の親クラスに引き上げることができる (Pull Up Methodパターンの適用) 2005/06/06 ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 11 Chained Cloneの分類 Case 3(複数のクラスにまたがっており,共通の親クラスを持たない場合) 互いにクローンとなっているメソッドが複数のクラスにまたがっており,共通の親クラスを持たない 各Chained Methodは,それぞれ同一のクラスに含まれている リファクタリング前 リファクタリング後 新たに作成した親クラス クラスA クラスB メソッド1 Chained Clone メソッドa1 メソッドb1 メソッドa2 メソッドb2 メソッド2 クラスA クラスB 新たに共通の親クラスを作成して,全てのクローンをそのクラスに引き上げることがで きる.(Extract Super Class パターンの適用) 2005/06/06 ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 12 Chained Cloneの分類 Case 4 (Chained Methodが複数のクラスにまたがっている場合) 含まれるChained Methodが複数のクラスにまたがっている Chained Clone クラスA クラスB メソッドa メソッドb クラスC クラスD メソッドc メソッドd Chained Clone単位でリファクタリングすることは困難 (個々のコードクローンとして,リファクタリングできる場合はある) 2005/06/06 ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 13 Chained Cloneの自動分類手法 方針 与えられたChained Cloneが,Case1~Case4のいずれに該当するか をメトリクスを用いて決定する 抽出すべき特徴 (1)互いにクローンとなっているメソッドが同一クラス内に存在するか,もしく は共通の親クラスを持つか (2)含まれるChained Methodが同一クラス内に存在するか,もしくは共 通の親クラスを持つか 2005/06/06 ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 14 メトリクスDCH (the Dispersion of Class Hierarchy) 与えられたメソッド群の共通の親クラスまでの距離の最大値を表す •DCH = 2 •例:DCH= 1 クラスS1 クラスS1 クラスS2 1 クラスA メソッドa 2 クラスB メソッドb クラスA クラスB クラスC メソッドa メソッドb メソッドc (注)与えられたメソッド群が共通の親クラスをもたない場合は未定義 DCHにより,与えられたメソッド群が同一クラス内に存在するか,もしくは共通の 親クラスを持つかを判断できる 2005/06/06 ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 15 提案するメトリクス DCHS:互いにクローンとなっているメソッドが同一クラス内に存在するか,もしくは共 通の親クラスを持つか DCHD:Chained Methodに含まれる各メソッドが同一クラス内に存在するか,もし くは共通の親クラスを持つか 各Chained Methodを構成しているメソッドに対し, それぞれDCHを求め,その最大値をDCHDとする メソッドa1 2005/06/06 メソッドa2 メソッドb1 メソッドb2 メソッドc1 メソッドc2 互いにクローンとなっている メソッドについて,それぞれ DCHを求め,その最大値 DCHSとする ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 16 メトリクスによるChained Cloneの分類 分類 DCHS DCHD Case 1 0 0 Case 2 1以上 0 Case 3 - 0 Any 1以上 or - Case 4 2005/06/06 意味 同一のクラスに包含されている. 複数のクラス間にまたがっており,かつ共通の親クラスを持つ. 更に,各Chained Methodはそれぞれ同一のクラスに含まれている. 複数のクラス間にまたがっており,かつ共通の親クラスを持たない. 更に,各Chained Methodはそれぞれ同一のクラスに含まれている. 含まれるChained Methodが複数のクラスにまたがっている. ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 17 適用実験 概要 目的 実際のソフトウェアにおけるChained Cloneの数,規模の調査 メトリクスを用いてChained Cloneを分類し,その分類に対応したリファク タリングパターンを適用できるか 対象 オープンソースプロジェクト ANTLR 2.7.4( 4.7万行,285クラス ) C++, Java, C#用コンパイラ・コンパイラ JBoss 3.2.6 ( 64万行,3364クラス ) J2EE アプリケーションサーバ 商用ソフトウェア X( 8万行,308クラス ) Y( 32万行, 289クラス ) 2005/06/06 ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 18 適用実験 Chained Cloneの検出(オープンソースプロジェクト) ANTLR 2.7.4 分類 検出数 メソッド数 最大 分類 検出数 最小 メソッド数 最大 Case 1 3 4 4 Case 2 6 40 6 Case 3 1 4 4 Case 4 合計 適 用 可 能 最小 Case 1 16 13 4 Case 2 17 8 4 Case 3 13 29 4 0 Case 4 4 44 6 10 合計 50 含まれるメソッド数が多いChained Cloneがある 3つの言語に対応した部分の多くが クローンとなっていたため 2005/06/06 JBoss 3.2.6 ANTLRと比較してCase 3が多い パッケージ内に複数のソフトウェアを 含むため,ソフトウェア間のクローンが 存在するため ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 19 適用実験 Chained Cloneの検出(商用ソフトウェア) X 分類 検出数 メソッド数 最大 Y 分類 検出数 最大 最小 Case 1 2 Case 2 0 0 Case 3 7 Case 4 0 Case 4 0 合計 9 合計 9 Case 1 0 Case 2 9 Case 3 14 メソッド数 4 最小 13 13 26 4 Case 2のみが存在 Case 3が多い 共通の部品クラスを継承したクラス 間にコードクローンが存在するため. 主に,データベースへのデータを追加, 更新,削除等の処理 ユーティリティクラスを集めたパッ ケージが2つあり,それらのパッケージ 間でコードクローンが存在するため 2005/06/06 ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 20 適用実験 リファクタリング例(1):Case 2(ANTLR) Pull Up Method reference CodeGenerator grammer reference CodeGenerator grammer reference reference getValueString call CSharp CodeGenerator Java CodeGenerator getValueString getValueString call mangleLiteral call mangleLiteral リファクタリング前 2005/06/06 mangleLiteral CSharp CodeGenerator Java CodeGenerator リファクタリング後 ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 21 適用実験 リファクタリング例(2):Case 3(ANTLR) Extract Super Class GeneralCharFormatter escapeString call CSharp CharFormatter Java CharFormatter escapeString escapeString call escapeChar call escapeChar リファクタリング前 2005/06/06 escapeChar CSharp CharFormatter Java CharFormatter リファクタリング後 ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 22 まとめ 依存関係のあるメソッドの集合がコードクローンとなっている ものをリファクタリングする手法を提案 Chained Cloneの定義 適切なリファクタリングパターンを提示するためのメトリクスを提 案 適用実験を通じた有効性の確認 今後の課題 メソッド以外のコード片への応用 2005/06/06 ソフトウェア信頼性研究会 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 23
© Copyright 2025 ExpyDoc