コードクローン間の依存関係に基づく リファクタリング支援環境の実装 吉田則裕1) 肥後芳樹1) 神谷年洋2) 楠本真二1) 井上克郎1) 1⁾大阪大学 大学院情報科学研究科 2⁾科学技術振興機構 さきがけ 大阪大学の吉田です. コードクローン間の依存関係に基づくリファクタリング支援環境の実装と題しまして,発表させていただきます. 2005/03/02 第67回 情報処理学会全国大会
背景(1)コードクローンとは ソースコード中に存在する同一,または類似したコード片 ソフトウェア保守を困難にする要因の一つ コピー&ペーストなどによる,プログラム再利用などが原因で生じる ソフトウェア保守を困難にする要因の一つ コードクローン まず,最初に背景としまして,コードクローンとは何か?ということについて説明いたします. コードクローンとは,ソースコード中に存在する同一,または類似したコード片のことで,コピーアンドペーストなどによる,プログラム再利用などが考えられます. コードクローンはソフトウェア保守を困難にする要因の一つといわれており,何らかの対策を考える必要があります. 2005/03/02 第67回 情報処理学会全国大会
背景(2)コードクローンへの対策 コードクローンの集約(リファクタリング) リファクタリングとは,ソフトウェアの外部的振る舞いを保ったままで,内部の構造を改善していく作業 重複したコード片(コードクローン)は最も優先してリファクタリングすべき[1] 将来的な修正コストの削減 新たに作成したメソッド 呼び出し文 Geminiの図 呼び出し文を含む コードクローンへの対策として,集約,リファクタリングを行い,将来的な修正コストを削減するという方法があります. リファクタリングとは,ソフトウェアの外部的振る舞いを保ったままで,内部の構造を改善していく作業のことです. この図のように,コード片a1とコード片a2がコードクローンとなっているとき,1つのコード片に集約することででコードクローンを除去します. [1] M. Fowler, Refactoring: improving the design of existing code, Addison Wesley, 1999. 2005/03/02 第67回 情報処理学会全国大会
現状の問題点 依存関係のあるメソッドの集合がコードクローンとなっている場合がある まとめてリファクタリングする方が効果的である コードクローンA メソッドa1 メソッドa2 コードクローンB メソッドb1 メソッドb2 ソフトウェア中には,依存関係のあるメソッドの集合がコードクローンとなっている場合があります. この図のように,メソッドA1とA2がコードクローンとなっているとき,A1から呼ばれているB1,A2から呼ばれているB2もコードクローンとなっており,更にそれらから呼ばれているメソッドC1, C2もコードクローンとなっている場合のことです. これまでの手法では,このように依存関係のあるメソッドの集合がコードクローンとなっている場合,個々のクローンとして検出し,個別にリファクタリング支援を行ってきました. しかし,この図で示したようなは依存関係のあるメソッドの集合がコードクローンとなっている場合,まとめてリファクタリングする方が効果的である コードクローンC メソッドc1 メソッドc2 2005/03/02 第67回 情報処理学会全国大会
本研究の目的 コードクローンとなっている依存関係のあるメソッドの集合をChained Cloneとして定義する それでは,これらを踏まえ,本研究の概要を述べたいと思います. ほんけん急で行ったことは大きく2つです. 1つ目は,先程から,述べているような依存関係のあるメソッドの集合がコードクローンとなっているものをChained Cloneとして定義します. 2つ目は,Chained Cloneに対するリファクタリング支援手法を提案します. それでは,この2つについて順に説明したいと思います. メソッドb1 メソッドb2 メソッドc1 メソッドc2 2005/03/02 第67回 情報処理学会全国大会
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/03/02 第67回 情報処理学会全国大会
対象とする依存関係 メソッドの呼び出し関係 同一のインスタンス変数の使用(参照・代入) 同一のインスタンス変数の使用 メソッドの呼び出し関係 メソッドa1 メソッドa2 使用 Call 使用 メソッドb1 メソッドb2 インスタンス変数α 本研究で考えている依存関係として,2種類の関係を用います. 1つ目は,メソッドの呼出関係です.これは,左の図のように,メソッドa1がb1を,b1がc1を呼び出しているような関係をいいます. 2つ目は,同一のインスタンス変数を使用しているという関係です.これは,右の図のように,メソッドa1,b1,c1が共通のインスタンス変数xを使用しているような関係をいいます.. Call 使用 メソッドc1 メソッドc2 2005/03/02 第67回 情報処理学会全国大会
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/03/02 第67回 情報処理学会全国大会
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/03/02 第67回 情報処理学会全国大会
Case3:複数のクラス間に分散しており,かつ共通の親クラスを持たない場合 リファクタリング前 リファクタリング後 新たに作成した スーパークラス クラスA クラスB メソッド1 Chained Clone メソッドa1 メソッドb1 メソッド2 メソッドa2 メソッドb2 次に,Case 3ですが,これはChained Cloneが複数のクラス間に分散しており,かつ共通の親クラスを持たない場合です. この場合,関係するクラスに共通の親クラスを新たに作成し,互いにクローンとなっているメソッドを新たに作成したメソッドに集約します.この図の場合,クラスA,B共通の親クラスを作成し,そのクラスに互いにクローンとなっているメソッドa1とb1,メソッドa2とb2を新たに作成した親クラスに集約します. クラスA クラスB 新たに共通のスーパークラスを作成して,全てのクローンをそのクラスに引き上げることができる (Extract Super Class パターンの適用) 2005/03/02 第67回 情報処理学会全国大会
Chained Cloneの分類方法 方針 抽出すべき特徴 与えられたChained Cloneが,Case1~Case4のいずれに該当するかをメトリクスを用いて決定する 抽出すべき特徴 (1)互いにクローンとなっているメソッドが同一クラス内に存在するか,もしくは共通の親クラスを持つか (2)含まれるChained Methodが同一クラス内に存在するか,もしくは共通の親クラスを持つか 2005/03/02 第67回 情報処理学会全国大会
メトリクスDCH 2 1 与えられたメソッド群のクラス階層上の距離を表す 例:DCH= 1 DCH = 2 クラスS1 クラスS1 クラス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/03/02 第67回 情報処理学会全国大会
提案するメトリクス DCHS:互いにクローンとなっているメソッドが同一クラス内に存在するか,もしくは共通の親クラスを持つか DCHD:Chained Methodに含まれる各メソッドが同一クラス内に存在するか,もしくは共通の親クラスを持つか 各Chained Methodを構成しているメソッドに対し,それぞれDCHを求め,その最大値をDCHDとする メソッドa1 メソッドa2 互いにクローンとなっているメソッドについて,それぞれDCHを求め,その最大値DCHSとする テーブルを作る メトリクスの分類 Chained CloneがC1~C5のいずれに該当するか決定をするために必要な情報は2つあります. 1つ目は,互いにクローンとなっているメソッドのDCHです. これにより,互いにクローンとなるメソッドの間に共通の親クラスが (2)含まれるChained MethodのDCH メソッドb1 メソッドb2 メソッドc1 メソッドc2 2005/03/02 第67回 情報処理学会全国大会
メトリクスによるChained Cloneの分類 DCHS DCHD 意味 Case 1 同一のクラスに含まれている場合 Case 2 1以上 複数のクラス間に分散しており, かつ共通の親クラスを持つ場合 Case 3 - かつ共通の親クラスを持たない場合 Case 4 0以上 or 依存関係がクラス間をまたがっている. かつ互いにクローンとなるメソッドは同じクラスに含まれるか,共通の親クラスを持つ場合 2005/03/02 第67回 情報処理学会全国大会
適用実験 概要 目的 対象 実際のソフトウェアにおけるChained Cloneの数,規模の調査 ANTLR 2.7.4( 4.7万行,285クラス ) C++, Java, C#用コンパイラ・コンパイラ JBoss 3.2.6 ( 64万行,3364クラス ) J2EE アプリケーションサーバ 2005/03/02 第67回 情報処理学会全国大会
適用実験(1) 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 1 14 合計 47 適用可能 特徴を言う C5消す 含まれるメソッド数が多いChained Cloneがある。 3つの言語に対応した部分の多くがクローンとなっていたため ANTLRと比較してCase 3が多い パッケージ内に複数のソフトウェアを含むため,ソフトウェア間のクローンが存在するため 2005/03/02 第67回 情報処理学会全国大会
GeneralCharFormatter 適用実験(2) Extract Super Class Case 3(ANTLRより抽出) GeneralCharFormatter escapeString call escapeChar CSharp CharFormatter Java CharFormatter escapeString escapeString Beforeの方に,Extract Super Classする前のクラスをてんてんで書く CSharp CharFormatter Java CharFormatter call call escapeChar escapeChar リファクタリング前 リファクタリング後 2005/03/02 第67回 情報処理学会全国大会
まとめ 依存関係のあるメソッドの集合がコードクローンとなっているものをリファクタリングする手法を提案 今後の課題 Chained Cloneの定義 適切なリファクタリングパターンを提示するためのメトリクスを提案 適用実験を通じた有効性の確認 今後の課題 メソッド以外のコード片への応用 2005/03/02 第67回 情報処理学会全国大会