コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現 吉田則裕1) 肥後芳樹1) 神谷年洋2) 楠本真二1) 井上克郎1) 1⁾大阪大学 大学院情報科学研究科 2⁾産業技術総合研究所 大阪大学の吉田です. コードクローン間の依存関係に基づくリファクタリング支援環境の実装と題しまして,発表させていただきます. 2005/06/06 ソフトウェア信頼性研究会
背景(1)コードクローンとは ソースコード中に存在する同一,または類似したコード片 ソフトウェア保守を困難にする要因の一つ コードクローン コピー&ペーストなどによる,プログラム再利用などが原因で生じる ソフトウェア保守を困難にする要因の一つ コードクローン 文を最初に全部述べる。その後、図を述べる まず,最初に背景としまして,コードクローンとは何か?ということについて説明いたします. コードクローンとは,ソースコード中に存在する同一,または類似したコード片のことで,コピーアンドペーストなどによる,プログラム再利用などが考えられます. コードクローンはソフトウェア保守を困難にする要因の一つといわれており,何らかの対策を考える必要があります. 2005/06/06 ソフトウェア信頼性研究会
背景(2)コードクローンへの対策 コードクローンの集約(リファクタリング) リファクタリングとは,ソフトウェアの外部的振る舞いを保ったままで,内部の構造を改善していく作業 重複したコード片(コードクローン)は、最も優先してリファクタリングすべき[1] 将来的な修正コストの削減 新たに作成したメソッド 呼び出し文 Geminiの図 呼び出し文を含む コードクローンへの対策として,集約,リファクタリングを行い,将来的な修正コストを削減するという方法があります. リファクタリングとは,ソフトウェアの外部的振る舞いを保ったままで,内部の構造を改善していく作業のことです. この図のように,コード片a1とコード片a2がコードクローンとなっているとき,1つのコード片に集約することででコードクローンを除去します. [1] M. Fowler, Refactoring: improving the design of existing code, Addison Wesley, 1999. 2005/06/06 ソフトウェア信頼性研究会
本研究の動機 依存関係のあるメソッドの集合がコードクローンとなっている場合がある メソッドa 集約 (リファクタリング) メソッドa1 メソッドb 集約 (リファクタリング) メソッドb1 メソッドb2 コードクローンB 従来との手法の比較 ソフトウェア中には,依存関係のあるメソッドの集合がコードクローンとなっている場合があります. この図のように,メソッドA1とA2がコードクローンとなっているとき,A1から呼ばれているB1,A2から呼ばれているB2もコードクローンとなっており,更にそれらから呼ばれているメソッドC1, C2もコードクローンとなっている場合のことです. これまでの手法では,このように依存関係のあるメソッドの集合がコードクローンとなっている場合,個々のクローンとして検出し,個別にリファクタリング支援を行ってきました. しかし,この図で示したようなは依存関係のあるメソッドの集合がコードクローンとなっている場合,まとめてリファクタリングする方が効果的である メソッドc 集約 (リファクタリング) メソッドc1 メソッドc2 コードクローンC 2005/06/06 ソフトウェア信頼性研究会
本研究の動機 依存関係のあるメソッドの集合がコードクローンとなっている場合がある まとめてリファクタリングする方が効果的である 集約 メソッドa1 メソッドa2 メソッドa 集約 メソッドb1 メソッドb2 メソッドb 従来との手法の比較 ソフトウェア中には,依存関係のあるメソッドの集合がコードクローンとなっている場合があります. この図のように,メソッドA1とA2がコードクローンとなっているとき,A1から呼ばれているB1,A2から呼ばれているB2もコードクローンとなっており,更にそれらから呼ばれているメソッドC1, C2もコードクローンとなっている場合のことです. これまでの手法では,このように依存関係のあるメソッドの集合がコードクローンとなっている場合,個々のクローンとして検出し,個別にリファクタリング支援を行ってきました. しかし,この図で示したようなは依存関係のあるメソッドの集合がコードクローンとなっている場合,まとめてリファクタリングする方が効果的である メソッドc1 メソッドc2 メソッドc 2005/06/06 ソフトウェア信頼性研究会
本研究の目的 コードクローンとなっている依存関係のあるメソッドの集合をChained Cloneとして定義する メソッドb1 メソッドb2 それでは,これらを踏まえ,本研究の概要を述べたいと思います. ほんけん急で行ったことは大きく2つです. 1つ目は,先程から,述べているような依存関係のあるメソッドの集合がコードクローンとなっているものをChained Cloneとして定義します. 2つ目は,Chained Cloneに対するリファクタリング支援手法を提案します. それでは,この2つについて順に説明したいと思います. メソッドc1 メソッドc2 2005/06/06 ソフトウェア信頼性研究会
Chained Cloneの定義 Chained Method Chained Clone Chained Clone Set CM1 CM2 Chained Method 依存関係のあるメソッドの集合 Chained Clone 与えられた2つのChained Method CM1とCM2から依存関係を表す有向グラフG1,G2を作ったときに以下の条件が成り立つもの G1とG2は同形グラフである G1とG2において対応する頂点(メソッド)は互いにクローンである Chained Clone Set Chained Cloneの同値類 G1 G2 さきに文を述べる。その後に図。 有こうへんの話をする それでは,Chained Cloneの定義を行います. まず,先程から出てきています依存関係のあるメソッドの集合をChained Methodと呼ぶことにし,これを用いてChained Cloneをこれから定義します. 右側にのせております図のようにChained Method CM1,CM2が与えられたとします.この図の同色の要素は,互いにクローンとなっているメソッドを表します. また,これらCM1, CM2の依存関係を表すグラフG1をG2をこの図のように作ったとします.そのときこの2つのグラフG1,G2が同形グラフであり,G1,G2上で対応する要素が互いにクローンであれば,これらのChained Method CM1, CM2はChained Cloneであるとします. また,Chained Cloneの同値類をChained Clone Setと呼びます. 頂点がメソッド, 有向辺が依存関係, 同色の頂点が互いにクローンとなっているメソッド 2005/06/06 ソフトウェア信頼性研究会
対象とする依存関係 メソッドの呼び出し関係 同一変数の使用(参照・代入) 同一変数の使用 メソッドの呼び出し関係 メソッドa1 メソッドa2 Call 使用 メソッドb1 メソッドb2 変数α 本研究で考えている依存関係として,2種類の関係を用います. 1つ目は,メソッドの呼出関係です.これは,左の図のように,メソッドa1がb1を,b1がc1を呼び出しているような関係をいいます. 2つ目は,同一のインスタンス変数を使用しているという関係です.これは,右の図のように,メソッドa1,b1,c1が共通のインスタンス変数xを使用しているような関係をいいます.. Call 使用 メソッドc1 メソッドc2 2005/06/06 ソフトウェア信頼性研究会
Chained Clone に対するリファクタリング Pull Up Method Extract Method Extract Super Class Chained Cloneを特徴に応じて,4種類に分類し,適切なリファクタリングパターンを適用する それでは,Chained Cloneに対するリファクタリングについて説明したいと思います. Chained Cloneを集約するリファクタリングパターンとしてPull Up Method, Extract Method, Extract Super Class利用します. Chained Cloneの特徴に応じて,5種類に分類し,適切なリファクタリングパターンを適用します. この5種類の分類を,Case 1からCase 5と名づけているのですが,時間の都合上,C1とC3の説明のみにさせていただきます. 2005/06/06 ソフトウェア信頼性研究会
Chained Cloneの分類 Case 1 (同一のクラスに包含されている場合) リファクタリング前 リファクタリング後 クラスA クラスA Chained Clone メソッドa11 メソッドa12 メソッドa1 メソッドa21 メソッドa22 メソッドa2 まず,Case 1ですが,これはChained Cloneが同一のクラスに含まれている場合です. この図のように,Chained Clone内に含まれる全てのメソッドが同一のクラスに存在する場合,同一のクラス内に,互いにクローンとなっているメソッドを集約します.この図では,互いにクローンとなっているメソッドa11とa12を集約しメソッド a1とし,同じくクローンとなっているメソッドa21とメソッドa22をメソッドa2に集約します. これは,Extract Method パターンの適用ともいえます. 同一のクラス内に全てのメソッドを集約可能 (Extract Methodパターンを適用) 2005/06/06 ソフトウェア信頼性研究会
Chained Cloneの分類 Case 2 (複数のクラスにまたがっており,共通の親クラスを持つ場合) 互いにクローンとなっているメソッドが複数のクラスにまたがっており,共通の親クラスを持つ 各Chained Methodは,それぞれ同一のクラスに含まれている リファクタリング前 リファクタリング後 親クラス 親クラス メソッド1 クラスA クラスB Chained Clone メソッド2 メソッドa1 メソッドb1 メソッドa2 メソッドb2 クラスA クラスB 全てのクローンを共通の親クラスに引き上げることができる (Pull Up Methodパターンの適用) 2005/06/06 ソフトウェア信頼性研究会
Chained Cloneの分類 Case 3(複数のクラスにまたがっており,共通の親クラスを持たない場合) 互いにクローンとなっているメソッドが複数のクラスにまたがっており,共通の親クラスを持たない 各Chained Methodは,それぞれ同一のクラスに含まれている リファクタリング前 リファクタリング後 新たに作成した親クラス クラスA クラスB メソッド1 Chained Clone メソッドa1 メソッドb1 メソッド2 リファクタリング後の図をさす 次に,Case 3ですが,これはChained Cloneが複数のクラス間に分散しており,かつ共通の親クラスを持たない場合です. この場合,関係するクラスに共通の親クラスを新たに作成し,互いにクローンとなっているメソッドを新たに作成したメソッドに集約します.この図の場合,クラスA,B共通の親クラスを作成し,そのクラスに互いにクローンとなっているメソッドa1とb1,メソッドa2とb2を新たに作成した親クラスに集約します. メソッドa2 メソッドb2 クラスA クラスB 新たに共通の親クラスを作成して,全てのクローンをそのクラスに引き上げることができる.(Extract Super Class パターンの適用) 2005/06/06 ソフトウェア信頼性研究会
Chained Cloneの分類 Case 4 (Chained Methodが複数のクラスにまたがっている場合) クラスB メソッドa メソッドb クラスC クラスD メソッドc メソッドd Chained Clone単位でリファクタリングすることは困難 (個々のコードクローンとして,リファクタリングできる場合はある) 2005/06/06 ソフトウェア信頼性研究会
Chained Cloneの自動分類手法 方針 抽出すべき特徴 与えられたChained Cloneが,Case1~Case4のいずれに該当するかをメトリクスを用いて決定する 抽出すべき特徴 (1)互いにクローンとなっているメソッドが同一クラス内に存在するか,もしくは共通の親クラスを持つか (2)含まれるChained Methodが同一クラス内に存在するか,もしくは共通の親クラスを持つか 2005/06/06 ソフトウェア信頼性研究会
メトリクスDCH (the Dispersion of Class Hierarchy) 与えられたメソッド群の共通の親クラスまでの距離の最大値を表す 例:DCH= 1 DCH = 2 クラスS1 クラスS1 クラスS2 2 1 クラスA クラスB クラスA クラスB クラスC メソッドa メソッドb メソッドa メソッドb メソッドc 共通の親クラスに注目して、説明 最大値の距離を赤で示す 例を用いて説明します. まず,左側の例から説明します. これは,クラスA,Bに1つずつメソッドが所属しており,またクラスA,Bには共通の親クラスが存在しているという例です. この場合,DCHは1となります. 次に,右側の例を説明します. これは,クラスA,B,Cに1つずつメソッドが所属しており, またクラスA,Bには共通の親クラスS2,クラスS2,クラスCには共通の親クラスS3が存在しているという例です. この場合,DCHは2となります. (注)与えられたメソッド群が共通の親クラスをもたない場合は未定義 DCHにより,与えられたメソッド群が同一クラス内に存在するか,もしくは共通の親クラスを持つかを判断できる 2005/06/06 ソフトウェア信頼性研究会
提案するメトリクス DCHS:互いにクローンとなっているメソッドが同一クラス内に存在するか,もしくは共通の親クラスを持つか DCHD:Chained Methodに含まれる各メソッドが同一クラス内に存在するか,もしくは共通の親クラスを持つか 各Chained Methodを構成しているメソッドに対し,それぞれDCHを求め,その最大値をDCHDとする メソッドa1 メソッドa2 互いにクローンとなっているメソッドについて,それぞれDCHを求め,その最大値DCHSとする メソッドb1 メソッドb2 テーブルを作る メトリクスの分類 Chained CloneがC1~C5のいずれに該当するか決定をするために必要な情報は2つあります. 1つ目は,互いにクローンとなっているメソッドのDCHです. これにより,互いにクローンとなるメソッドの間に共通の親クラスが (2)含まれるChained MethodのDCH メソッドc1 メソッドc2 2005/06/06 ソフトウェア信頼性研究会
メトリクスによるChained Cloneの分類 DCHS DCHD 意味 Case 1 同一のクラスに包含されている. Case 2 1以上 複数のクラス間にまたがっており,かつ共通の親クラスを持つ. 更に,各Chained Methodはそれぞれ同一のクラスに含まれている. Case 3 - 複数のクラス間にまたがっており,かつ共通の親クラスを持たない. Case 4 Any or 含まれるChained Methodが複数のクラスにまたがっている. 2005/06/06 ソフトウェア信頼性研究会
適用実験 概要 目的 対象 実際のソフトウェアにおけるChained Cloneの数,規模の調査 適用実験 概要 目的 実際のソフトウェアにおける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 ソフトウェア信頼性研究会
適用実験 Chained Cloneの検出(オープンソースプロジェクト) ANTLR 2.7.4 JBoss 3.2.6 分類 検出数 メソッド数 最大 最小 Case 1 3 4 Case 2 6 40 Case 3 1 Case 4 合計 10 分類 検出数 メソッド数 最大 最小 Case 1 16 13 4 Case 2 17 8 Case 3 29 Case 4 44 6 合計 50 適用可能 合計を先にいう 特徴を言う C5消す 含まれるメソッド数が多いChained Cloneがある 3つの言語に対応した部分の多くがクローンとなっていたため ANTLRと比較してCase 3が多い パッケージ内に複数のソフトウェアを含むため,ソフトウェア間のクローンが存在するため 2005/06/06 ソフトウェア信頼性研究会
適用実験 Chained Cloneの検出(商用ソフトウェア) X Y 分類 検出数 メソッド数 最大 最小 Case 1 Case 2 9 14 4 Case 3 Case 4 合計 分類 検出数 メソッド数 最大 最小 Case 1 2 13 Case 2 Case 3 7 26 4 Case 4 合計 9 特徴を言う C5消す Case 2のみが存在 共通の部品クラスを継承したクラス間にコードクローンが存在するため.主に,データベースへのデータを追加,更新,削除等の処理 Case 3が多い ユーティリティクラスを集めたパッケージが2つあり,それらのパッケージ間でコードクローンが存在するため 2005/06/06 ソフトウェア信頼性研究会
適用実験 リファクタリング例(1):Case 2(ANTLR) Pull Up Method CodeGenerator reference CodeGenerator reference grammer reference reference grammer getValueString call CSharp CodeGenerator Java CodeGenerator mangleLiteral getValueString getValueString 説明を Beforeの方に,Extract Super Classする前のクラスをてんてんで書く call call CSharp CodeGenerator Java CodeGenerator mangleLiteral mangleLiteral リファクタリング前 リファクタリング後 2005/06/06 ソフトウェア信頼性研究会
適用実験 リファクタリング例(2):Case 3(ANTLR) Extract Super Class GeneralCharFormatter escapeString call escapeChar CSharp CharFormatter Java CharFormatter escapeString escapeString CSharp CharFormatter Java CharFormatter Beforeの方に,Extract Super Classする前のクラスをてんてんで書く call call escapeChar escapeChar リファクタリング前 リファクタリング後 2005/06/06 ソフトウェア信頼性研究会
依存関係のあるメソッドの集合がコードクローンとなっているものをリファクタリングする手法を提案 まとめ 依存関係のあるメソッドの集合がコードクローンとなっているものをリファクタリングする手法を提案 Chained Cloneの定義 適切なリファクタリングパターンを提示するためのメトリクスを提案 適用実験を通じた有効性の確認 今後の課題 メソッド以外のコード片への応用 2005/06/06 ソフトウェア信頼性研究会