コードクローン統合分析ツール ICCA 肥後 芳樹† ,吉田 則裕† ,神谷 年洋‡,楠本 真二† ,井上 克郎† †大阪大学 大学院情報科学研究科 {y-higo, n-yosida, kusumoto, inoue}@ist.osaka-u.ac.jp ‡科学技術振興機構 さきがけ [email protected] Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 1 ICCA - 概要(1/2) GUI ベースの統合分析ツール CCFinder をコードクローン検出エンジンとして使用 目的別にサブコンポーネントが存在 可視化,理解支援 - Gemini コンポーネント リファクタリング支援 - Aries コンポーネント デバッグ支援 - Libra コンポーネント 実装言語 Java 規模 ファイル数 : 523 総行数 : 約136,000行 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 2 ICCA - 概要(2/2) ICCA (Integrated Code Clone Analyzer) Code clone detector (CCFinder) Subsystem Refactoring Support Aries Software Understanding Software Visualization Gemini Debug Support Libra User Code clone repository Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 3 クローンペア と クローンセット クローンペア: 互いに一致・類似しているコード片の対 クローンセット: 互いに一致・類似しているコード片の集合 以前はクローンクラスと言っていました クローンペア クローンセット (C1, C4) {C1, C4, C5} C2 (C1, C5) {C2, C3} C3 (C2, C3) C4 (C4, C5) C1 C5 CCFinder はコードクローンをクローンペアとして検出する CCFinder 配布セットには CCReformer というツールが含まれており,このツー ルを用いるとクローンペアをクローンセットに変換することができる Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 4 Gemini - 概要 目的 CCFinder の検出したコードクローンの可視化・理解支援 これまでに配布している Gemini の機能強化版 旧 Gemini との比較 分析の分離 旧 Gemini : 全てのビューが密接に関連 新 Gemini : “クローンベースの分析”と”ファイルベースの分析” スケーラビリティの改善 旧 Gemini : 数万行(検出したクローンの量に依存) 新 Gemini : 数百万行(検出したクローンの量に依存) Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 5 Gemini - 分析の分離 旧 Gemini では全てのビューが密接に関連をしている 理解しにくい 分析を “クローンベースの分析” と “ファイルベースの分析” に分 離 クローンベースの分析 ファイルベースの分析 メトリクスグラフ スキャタープロット クローンセットリスト ファイルリスト ソースコードビュー グループリスト ディレクトリツリー ソースコードビュー Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 6 Gemini - スキャタープロット a b c a b c a d e c a b c a b c a d e c 原点は左上角 水平軸,垂直軸はソースコードの トークン列を表す 黒い点は,両軸の対応したトークン が一致していることを表す 主対角線上では自己比較が行 われるため,常に主対角線が描 画される CCFinderから検出されてくるよ うなクローンペアは,対角線分と して現れる a, b, c, ... : tokens : matched position Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 7 Gemini - メトリクスグラフ(1/3) メトリクスグラフで用いているメトリクス LEN(S) : クローンセット S に含まれるコード片のトークン数の平均値 POP(S) : S に含まれるコード片の数 DFL(S) : S に含まれる全てのコード片を1つのサブルーチンにマージした場合の トークン減少数の予測値 new sub routine caller statements RAD(S) : S に含まれるコード片がファイルシステム内での分散度 全てのコード片が1つのファイル内に存在 : RAD(S) = 0 全てのコード片が1つのディレクトリ内に存在 : RAD(S) = 1 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 8 Gemini - メトリクスグラフ(2/3) メトリクスの続き RNR(S) : S に含まれるコード片がどの程度”非繰り返し”であるか を表す. 例 : 以下のトークン列を考える このトークン列から,CCFinder はコード片 F1とF2 がクローンに なっていると検出する. この時 RNR(S) は以下の式で計算される Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 9 Gemini - メトリクスグラフ(3/3) パラレルコーディネーショングラフ 各メトリクス毎に平行座標軸 1つのクローンセットにつき,1本の折れ線を描画 RAD LEN POP DFL RNR 4 3 2 1 0 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 10 Gemini - スケーラビリティの改善 旧 Gemini において著しくスケーラビリティを低下させていたのはスキャ タープロット(クローンペアデータ) スキャタープロットの改善 ズーム機能 旧 Gemini : 50倍が限度 新 Gemini : 1つのファイルにまで拡大可能 クローンのレンダリング 旧 Gemini :常に1つのクローンペアにつき,1本の線分を描画 新 Gemini : 状況に応じて,複数のクローンをまとめて描画 なくなった機能 ソーティング機能 旧 Gemini : ファイルID,クローン率などで並び替えが可能 新 Gemini : 並び替えは不可能 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 11 Gemini – 分析例(デモンストレーション) クローンベースの分析 1例 ファイルベースの分析 3例 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 12 Gemini - クローンベースの分析例 目的 クローンセットをその特徴に基づいて絞込みを行う 解析の流れ(例) 1. メトリクスグラフを用いてクローンセットの絞込み 2. クローンセットリストを用いて,絞り込んだクローンセットのソーティング 3. ソースコードビューを用いて絞り込んだクローンのソースコード閲覧 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 13 Gemini - ファイルベースの分析例(1/2) 目的 ファイルをその情報に基づいて絞込みを行う 解析の流れ(例) 例1: ディレクトリツリーから 1. ディレクトリツリーでファイル(またはディレクトリ)を選択 2. スキャタープロットでクローン分布状態を確認 3. ソースコードビューでファイルのソースコードを閲覧 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 14 Gemini - ファイルベースの分析(2/2) 解析の流れ(続き) 例2: ファイルリストから ファイルリストで定量的な値に基づき,ファイルを選択 選択されたファイルとクローンを共有しているファイルを確認 ソースコードビューで選択されたファイルのソースコードを閲覧 例3: グループリストから グループリストでクローン率が高いグループを選択 選択されたグループに含まれているファイルを確認 選択されたグループと他の各グループとの類似度を確認 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 15 Gemini - ファイルメトリクス NOL(f): ファイル f の行数 NOT(f): f のトークン数 NOC(f): f に含まれているコードクローンの数 ROC(f): f がどの程度クローンになっているかを表す 例: ファイル f1 は 200 トークンから成り,そのうちの 100 トークンが コードクローンになっている ROC(f1) = (100 / 200) × 100% = 50% NOF(f): f とクローンを共有しているファイルの数 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 16 Gemini – フラグメントリスト コードフラグメントの属性 ファイル内位置 開始行.開始列 - 終了行.終了列 長さ トークン数 分散度(ディレクトリ構造上どの程度広がっているか) Dense: 全てのクローンが同一ファイル内に存在 Middle: 全てのクローンが同一ディレクトリ内に存在 Scattered: クローンはディレクトリをまたがって存在 同形コードフラグメントの数 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 17 Gemini – グループメトリクス NOF(g): グループ g に含まれるファイルの数 NOL(g): g に含まれるファイルの行数の和 NOT(g): g に含まれるファイルのトークン数の和 NOC(g): g に含まれるコードクローンの数 ROC(g): g がどの程度クローンになっているかを表す 例1. g1 にはファイル f1 と f2 が含まれている f1 は 200 トークンから成り,そのうちの 20 トークンがクローンと 成っている f2 は 300 トークンから成り,そのうちの 80 トークンがクローンと 成っている ROC(g1) = (20 + 80) / (200 + 300) ×100% = 20% Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 18 Aries - 概要(1/2) 目的 コードクローンの集約(リファクタリング)支援 リファクタリング支援のための処理 理由 CCFinder はコードクローンとトークンの列として検出するために, 検出されたコードクローンはリファクタリングに適しているとは言え ない 処理内容 CCFinder の検出したクローンから,まとまりのある部分を抽出 抽出部分を,メトリクスを用いて定量的な特徴づけ Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 19 Aries - 概要(2/2) 一般的なリファクタリングプロセス 1. リファクタリング箇所の特定 2. リファクタリング方法の選定 3. リファクタリング効果の調査 4. ソースコードの修正 5. 回帰テストの実施 Aries では 1. と 2. をサポート Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 20 Aries - リファクタリング箇所の抽出 目的 CCFinder はトークンの列としてコードクローンを検出 検出された全てのコードクローンがリファクタリング可能ではない リファクタリングのできそうな部分を抽出することで,より効率的なリ ファクタリング支援ができる 抽出箇所 プログラミング言語での構造的なまとまり 例: Java 言語 宣言単位 : クラス宣言, インターフェース宣言 メソッド単位 : メソッド本体,コンストラクタ, 文単位 : do文,for文,if文,switch文,synchronized文, try 文,while文 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 21 fragment 1 609: 610: 611: 612: 613: 614: 615: 616: 617: 618: 619: 620: 621: 622: 623: 624: 625: 626: 627: 628: reset(); grammar = g; // Lookup make-switch threshold in the grammar generic options if (grammar.hasOption("codeGenMakeSwitchThreshold")) { try { makeSwitchThreshold = grammar.getIntegerOption("codeGenMakeSwitchThreshold"); //System.out.println("setting codeGenMakeSwitchThreshold to " + makeSwitchThreshold); } catch (NumberFormatException e) { tool.error( "option 'codeGenMakeSwitchThreshold' must be an integer", grammar.getClassName(), grammar.getOption("codeGenMakeSwitchThreshold").getLine() ); } } CCFinder が検出する コードクローン // Lookup bitset-test threshold in the grammar generic options if (grammar.hasOption("codeGenBitsetTestThreshold")) { try { bitsetTestThreshold = grammar.getIntegerOption("codeGenBitsetTestThreshold"); fragment 2 623: 624: 625: 626: 627: 628: 629: 630: 631: 632: 633: 634: 635: 636: 637: 638: 639: 640: 641: 642: } // Lookup bitset-test threshold in the grammar generic options if (grammar.hasOption("codeGenBitsetTestThreshold")) { try { bitsetTestThreshold = grammar.getIntegerOption("codeGenBitsetTestThreshold"); //System.out.println("setting codeGenBitsetTestThreshold to " + bitsetTestThreshold); } catch (NumberFormatException e) { tool.error( "option 'codeGenBitsetTestThreshold' must be an integer", grammar.getClassName(), grammar.getOption("codeGenBitsetTestThreshold").getLine() ); } } Aries が抽出する部 分 // Lookup debug code-gen in the grammar generic options if (grammar.hasOption("codeGenDebug")) { Token t = grammar.getOption("codeGenDebug"); if (t.getText().equals("true")) { Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 22 fragment 3 1007: 1008: 1009: 1010: 1011: 1012: 1013: 1014: 1015: 1016: 1017: 1018: 1019: if ( inputState.guessing==0 ) { buf.append(a.getText()); } { _loop144: do { if ((LA(1)==WILDCARD)) { match(WILDCARD); a=id(); if ( inputState.guessing==0 ) { buf.append('.'); buf.append(a.getText()); } } CCFinder が検出する コードクローン fragment 4 1527: 1528: 1529: 1530: 1531: 1532: 1533: 1534: 1535: 1536: 1537: 1538: 1539: if ( inputState.guessing==0 ) { t=a.getText(); } { _loop84: do { if ((LA(1)==COMMA)) { match(COMMA); id(); if ( inputState.guessing==0 ) { t+=","+b.getText(); } } Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 23 Aries - メトリクスを用いた特徴づけ(1/2) 目的 抽出した部分はメソッドなどのまとまりのあるクローンになっているが, それらがどのようにリファクタリング可能であるかは不明 人が各抽出部分がどのように集約できるかを調査するのは非効率 メトリクスを用いて特徴づけを行い,どのように集約できるかを予測 どのように集約できるか 既存のリファクタリングパターンを用いる Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 24 Aries - メトリクスを用いた特徴づけ(2/2) 以下のリファクタリングパターン[1][2]が,コードクローンの集約に用いることができる Extract Class, Extract Method, Extract Super Class, Form Template Method, Move Method, Parameterize Method, Pull Up Constructor, Pull Up Method, Aries は抽出した各クローンに対して,上記のリファクタリングパターンのどれが適して いるかを示す [1]: M. Fowler: Refactoring: Improving the Design of Existing Code, Addison-Wesley, 1999. [2]: http://www.refactoring.com/, 2004. Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 25 Aries - ボリュームメトリクス(LEN, POP, DFL) メトリクスグラフで用いているメトリクス LEN(S) : S に含まれるコード片のトークン数の平均値 POP(S) : S に含まれるコード片の数 DFL(S) : S に含まれる全てのコード片を1つのサブルーチンにマー ジした場合のトークン減少数の予測値 new sub routine caller statements Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 26 例: ・クローンセット S1 は f1 と f2 を含んでいる ・コード片 f1 では, 外部定義の変数 b と c に対して参照, a に対して代入を行っている NRV(S): S に含まれるコード片が,その外部で定義された変数をどの程度参照して ・コード片 f2 では f1 と同様の処理が行われているとする いるかを表す NSV(S): S に含まれるコード片が,その外部で定義された変数に対してどの程度代 then,NRV(S) = ( 2 + 2 ) / 2 = 2 入を行っているかを表す NSV(S) = ( 1 + 1 ) / 2 = 1 Aries - 結合度メトリクス(NRV, NSV) 定義 int a , b, c; コード片 f1 … if( … ){ reference …; assignment クローンセット … =S bはコード片 + c; f1, f2, ・・・, fn を含んでいる si はコード片 i の内部で参照されている外部定義変数の数を表す a = f…; ti はコード片 …;fi の内部で代入されている外部定義変数の数を表す } … Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 27 例 2: 例 3: ・クローンセット S はコード片 f1 ,f2を含んでいる ・クローンセット S はコード片 f1 , f2 を含んでいる ・f1 を含むクラスと,f2を含むクラスの直接の親クラス ・ コード片f 1 を含むクラスと コード片f2 を含むクラス 例 1: が共通であった場合, が共通の親クラスを持っていない場合, DCH(S): S に含まれるコード片がクラス階層において,どの程度広く ・クローンセット S はコード片 f1 ,f2を含んでいる 分散しているかを表す ・コード片f DCH(S) =1 1 を含むクラスとコード片f 2を含むクラスが DCH(S) = ∞ 同一であった場合, DCH(S) = 0 Aries - 分散度メトリクス(DCH) 定義 クラス A S はコード片 f1, f2, ・・・,fn を含む class B class Aクローンセット クラス Af はクラス C 中に存在する コード片 コード片 f1 i i コード片 f2 C , C , ・・・,C の共通の親クラスのうち,クラス階層 クラス Cfp1 は,クラス 1 2 n コード片 的に最も下に位置するクラスを表す コード片 f2 クラス C Ci と クラス Cj のクラス階層内での距離を現す クラス B D(Ci, Cj) はクラス コード片 f1 コード片 f2 もしクラス C1,C2,・・・,Cn が共通の親クラスを持たない時は DCH(S) は ∞ とする このメトリクスは対象ソフトウェアのクラス階層内のみで計算される Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 28 Aries - 分析手順(デモンストレーション) 1. クローンセットの絞込み メトリクスグラフ メトリクス値による絞込み ユニットセレクションチェックボックス 単位による絞込み 2. クローンセットの選択 クローンセットリスト 各メトリクス値に基づいたソーティングが可能 3. 選択したクローンセット情報の取得 クローンセットビューワー コード片のリスト ソースコード コードクローン内で用いている外部定義変数一覧 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 29 Aries - 変数の種類 this_class_field 自クラスのフィールド super_class_field 親クラスのフィールド Interface_field インターフェースのフィールド local ローカル変数 outer 外側のクラス内で定義された変数 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 30 Libra - 概要 目的 ソースコード修正(デバッグ,機能追加など)の支援 あるコードクローンに対して修正を行うと,それと対応する全ての コードクローンに対して,同様の修正の是非を考慮する必要が ある Gemini コンポーネントとの違い ユーザは検出したいコード片を入力 無駄なコードクローンは検出しない Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 31 Libra - 検出手法 CCFinder の検出オプションを利用 CCFinder は以下の 3タイプのクローン検出のオン,オフがオプションで指定でき る ファイル内クローン ファイル間クローン グループ間クローン ユーザが入力したコード片をグループ1,対象ソースコードをグループ2として,グ ループ間クローンのみを検出するオプションをつけて,CCFinder を実行する この検出手法のメリット 検出時間の短縮 CCFinder はコードクローンを検出した後,ソーティングを行ってからコードク ローンを出力する 無駄なクローンを検出しないことで,ソーティング時間を短縮できる Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 32 Libra - 分析手順(デモンストレーション) 1. 2. 3. 4. コードクローン検出対象ファイルを選択 検出を行うコード片を入力 ディレクトリツリーで,どのファイルにクローンが含まれているのかを確認 ソースコードビューで,ファイルのどの部分がクローンになっているのかを 確認 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 33 日立システムアンドサービス での適用事例 肥後 芳樹† ,前田憲一‡ †大阪大学 大学院情報科学研究科 [email protected] ‡株式会社 日立システムアンドサービス [email protected] Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 34 適用対象 対象ソフトウェア 日立システムアンドサービス(社内システム) 規模 行数: 約7万行 クラス数: 309 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 35 コードクローン検出 検出オプション 最小一致トークン数: 50(約10行) 以下のユーザ定義名の正規化は行わない 変数の型 リテラル メソッド名 検出クローンセット数 宣言単位: 4 メソッド単位: 13 文単位: 49 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 36 用いたリファクタリングパターン 宣言,メソッド,文単位のクローンセットに対して以下のリファクタリング パターンの適用を試みた. 宣言単位: Extract Super Class クローンとなっているクラスに対して共通の親クラスを作成 共通の機能は親クラスに引き上げ クラスがまったく同一の場合は,1つを残して他は削除 メソッド単位: Move Method ユーティリティクラス等に移動 文単位: Extract Method メソッド内の一部分を新たなメソッドとして抽出 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 37 パターン1: Extract Super Class Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 38 パターン2: Move Method Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 39 パターン3: Extract Method void printOwing() { printBanner(); //print details System.out.println ("name: " + _name); System.out.println ("amount " + getOutstanding()); } void printOwing() { printBanner(); printDetails(getOutstanding()); } void printDetails (double outstanding) { System.out.println ("name: " + _name); System.out.println ("amount " + outstanding); } Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 40 絞込み条件 Extract Super Class クラス単位のクローンセット 親クラスのメンバを用いていない(NSV,NRV が0) 共通の親クラスがない(DCH が∞) Move Method メソッド本体のクローンセット 現在定義されているクラスのメンバを用いていない(NSV,NRVが0) Extract Method 文単位のクローンセット クローン外部で定義された変数に対しては,高々1つにしか代入を行っていない (NSV が1以下) 全てのクローンが単一のクラス内に存在する(DCHが0) 3つ以上同一のコード片が存在(POPが3以上) Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 41 絞込み結果 検出クローンセット数 宣言単位: 4 メソッド単位: 13 文単位: 49 絞込み条件に一致したクローンセット数 Extract super Class: 4 Move Method: 5 Extract Method: 12 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 42 評価方法(1/3) 絞り込まれた各クローンセットに対して以下の評価を行って頂いた クローンの現在の状態について( (a),(b)から選択) ソフトウェアのサイズ(※1) ソフトウェアのデザイン(※2) クラスの凝集度(※3) クラス間の結合度(※4) パフォーマンス (a)悪化させている, (b) 影響していない ※1 モジュール(クラスやメソッドなど)のステップ数やトークン数を表す ※2 クラスの階層構造やカプセル化を表す ※3 1つのクラスが責任を持って1つの機能を提供しているかを表す.1つのクラスが複数の事柄を扱っていたり,また 特に何も機能を提供していない場合は,凝集度的にみて悪い(低い)ことを表す ※4 他のクラスのフィールドやメソッドを用いていることを表す.フィールドやメソッドが適切なクラスに定義されていないと 必要以上に他クラスのフィールドやメソッドを呼び出すことになり,結合度的にみて悪い(高い)ことを表す. Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 43 評価方法(2/3) 評価の続き リファクタリングの効果について( (a) (b) (c) (d) から選択) サイズ面 デザイン面 クラスの凝集度の面 クラス間の結合度の面 パフォーマンス面 ソースコードの可読性 ソースコードの再利用性 (a) 改善される,(b) 将来的な問題の予防にはなる, (c) 効果なし,(d) 悪化する Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 44 評価方法(3/3) 評価の続き リファクタリングのコストについて((a) (b) (c) から選択) ソースコードの修正 回帰テスト (a)非常に煩雑,(b)少し手間がかかる,(c) すぐに完了できる 総合的な評価((a) (b) (c) (d) から選択) このクローンセットは (a) すぐにリファクタリングすべき (b) 将来的にはリファクタリングすべき (c) リファクタリングしてもしなくてもよい (d) リファクタリングすべきではない Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 45 評価結果 - Extract Super Class(1/3) (クラス単位の)クローンの現在の状態 (a) 悪化させている (b) 影響していない ソフトウェアのサイズついて 4 0 ソフトウェアのデザインについて 4 0 クラスの凝集度について 0 4 クラス間の結合度について 0 4 パフォーマンスについて 0 4 全てのクローンセットがサイズとデザインを悪化させていた どのクローンセットも凝集度,結合度,パフォーマンスには影響して いなかった Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 46 評価結果 - Extract Super Class(2/3) (クラス単位の)リファクタリングの効果 (b) 将来的な問題の 予防にはなる (a) 改善される (c) 効果なし (d) 悪化する サイズ 2 2 0 0 デザイン 2 2 0 0 クラスの凝集度 0 0 4 0 クラス間の結合度 0 0 4 0 パフォーマンス 0 0 4 0 ソースコードの可読性 1 3 0 0 ソースコードの再利用性 1 3 0 0 全てのクローンセットのリファクタリングがサイズ,デザイン,可読性, 再利用性の面で有効である どのクローンセットのリファクタリングも凝集度,結合度,パフォーマン ス面では効果がない Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 47 評価結果 - Extract Super Class(3/3) (クラス単位の)リファクタリングのコスト (a) 非常に煩雑である (b) 少し手間がかかる (c) すぐに完了できる ソースコードの修正は 0 3 1 回帰テストは 2 1 1 ソースコードの修正はそれほどコストがかからない 回帰テストは煩雑になる場合がある (クラス単位の)総合的な評価 (a) すぐにすべき リファクタリングを 2 (b) 将来的には すべき (c) してもしなくて もよい 2 (d) すべきではない 0 0 全てのクローンセットがリファクタリングするべき Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 48 評価結果 - Move Method(1/3) (メソッド単位の)クローンの現在の状態 (a) 悪化させている (b) 影響していない ソフトウェアのサイズついて 5 0 ソフトウェアのデザインについて 5 0 クラスの凝集度について 4 1 クラス間の結合度について 0 5 パフォーマンスについて 1 4 全てのクローンセットがサイズ,デザインを悪化させていた. 多くのクローンセットが凝集度を悪化させていた リファクタリングすべき箇所を検出できている ほとんどのクローンセットが結合度,パフォーマンスには影響していな かった Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 49 評価結果 - Move Method(2/3) (メソッド単位の)リファクタリングの効果 (a) 改善される (b) 将来的な問題の 予防にはなる サイズ 5 0 0 0 デザイン 5 0 0 0 クラスの凝集度 5 0 0 0 クラス間の結合度 0 0 5 0 パフォーマンス 0 0 5 0 ソースコードの可読性 4 1 0 0 ソースコードの再利用性 4 1 0 0 (c) 効果なし (d) 悪化する 全てのクローンセットのリファクタリングがサイズ,デザイン,凝集度, 可読性,再利用性の面で有効である どのクローンセットのリファクタリングも結合度,パフォーマンス面では 効果がない Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 50 評価結果 - Move Method(3/3) (メソッド単位の)リファクタリングのコスト (a) 非常に煩雑である (b) 少し手間がかかる (c) すぐに完了できる ソースコードの修正は 0 0 5 回帰テストは 0 0 5 ソースコードの修正,回帰テスト共にそれほどコストがかからない (メソッド単位の)総合的な評価 (a) すぐにすべき リファクタリングを 4 (b) 将来的には (c ) してもしなくて すべき もよい 1 (d) すべきではない 0 0 全てのクローンセットがリファクタリングするべき Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 51 評価結果 ー Extract Method(1/3) (文単位の)クローンの現在の状態 (a) 悪化させている (b) 影響していない ソフトウェアのサイズついて 2 10 ソフトウェアのデザインについて 2 10 クラスの凝集度について 0 12 クラス間の結合度について 0 12 パフォーマンスについて 0 12 一部のクローンセットがサイズ,デザインを悪化させていた. 全てのクローンセットが凝集度,結合度,パフォーマンスには影響し ていなかった Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 52 評価結果 - (2/3) (文単位の)リファクタリングの効果 (b) 将来的な問題の 予防にはなる (a) 改善される (c) 効果なし (d) 悪化する サイズ 0 5 4 3 デザイン 0 3 3 6 クラスの凝集度 0 0 12 0 クラス間の結合度 0 0 12 0 パフォーマンス 0 0 12 0 ソースコードの可読性 0 4 3 5 ソースコードの再利用性 2 2 4 4 サイズ,デザイン,可読性,再利用性は,リファクタリングの効果あり, 効果なし,逆効果に分かれた 全てのリファクタリングが凝集度,結合度,パフォーマンスについては 効果がなかった Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 53 評価結果 - (3/3) (文単位の)リファクタリングのコスト (a) 非常に煩雑である ソースコードの修正は 回帰テストは (b) 少し手間がかかる (c) すぐに完了できる 4 5 3 4 6 2 半数のクローンセットが,ソースコード修正・回帰テスト共にコストが 大きい (文単位の)総合的な評価 (a) すぐにすべき リファクタリングを 0 (b) 将来的には すべき 3 (c) してもしなくて もよい (d) すべきではない 3 6 半数のクローンセットがリファクタリングすべきでない Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 54 考察 クラス単位,メソッド単位のクローンセットはリファクタリングすべき 対象のクローンセットはソフトウェアの保守性を悪化させていた リファクタリングにより保守性の改善を期待できる コストがそれほどかからない 文単位のクローンセットはリファクタリングすべきでないものが存在した メソッドの一部分を抽出する作業は煩雑 条件をきつくする 修正支援を行う 用いているフレームワークに依存したクローンセット Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 55 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 56 CCFinder: Clone Detection Process Source files throws {{ String (( (( )) )) throws $$ $$foo foofoo() 1. static void throws RESyntaxException static throws$$RESyntaxException RESyntaxException String aa { static void throws {{ $$ $$ new ]{{] {{$$ "123,400" , [[ [[]] String $$String $$ = new ]] == a[] String $[] { "123,400", 2. [[String new "abc", "orange 100" }; "abc" , "orange 100" } ; org . apache . regexp ; } } ; 3. org.apache.regexp.RE pat = new org.apache.regexp.RE("[0-9,]+"); new $$ == $$ pat ==new new 4. .intRE sum 0; org . apache . regexp . RE ) ; int == $$00 $ $$ (( "[0-9,]+" "[0-9,]+" int sum $$ sum $$ = 5. for (int i$ = 0; i) < ;a.length; ++i) ;; for < $$ i$$i == int for (( int = 0$$0 ;;; i$$i << 6. a$ if. (pat.match(a[i])) ;; ++ if ifif(( (($$ pat $$ ;; ++ length ++$$ ii)) ))if pat $ . length ++ 7. .. match sum += Sample.parseNumber(pat.getParen(0)); $$ (( (( $$ aa [[ [[ $$ ii ]] ]] )) )) )) )) $$sum sum 8. += System.out.println("sum "getParen + sum); (( 00 (( $$ .. $$ (( ((pat $$ .. $.$. parseNumber parseNumber pat$$ .= . getParen += Sample 9. } )) )) ;; System .. .$$. println $$ .. .$$. out System out println "sum=="" (( $$ (( "sum static String $$ $$goo }}}} static ))) ;;;; goo(String $$ void 10. static [] ((a)(( $$throws RESyntaxException { ++ sum static void void goo String static ]] ))) =throws = {{ RE $$RE("[0-9,]+"); [[ exp throws RESyntaxException RE exp exp == {{ $$ $$ = 11. a$$RE newRESyntaxException =sum$ == 00 $ ) ; )) $;; $int $ (( "[0-9,]+" int sum 12. newintRE sum"[0-9,]+" = 0; for (( int for 0$ ;; i$i << 13. ;; for (intint$i =i$i 0;== i 0< a.length; ++i) $ ; ++ ;; ++ length a$ .. length ++$ ii) ))if ifif( (($ exp exp 14. . match if (exp.match(a[i])) $ ( (( $ aa [ [[ $ ii ] ]] ) )) ) )) $sum sum 15. += parseNumber sum += parseNumber(exp.getParen(0)); ( . $ getParen $ ( ( $exp. (. $exp getParen () 0) )( )0 ) ) $$ .. parseNumber 16. ;; System.out.println("sum + sum sum); ( $ ((+ "sum . .$. println $ . $.. out ==""" ++ out $ = System println "sum sum 17. })) ;; }} Lexical Lexical analysis analysis Token Token sequence sequence Transformation Transformation Transformed Transformed token token sequence sequence Match Match detection detection Clones Clones on on transformed transformed sequence sequence Formatting Formatting Clone pairs Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 57 Aries - その他のメトリクス1(DOC) DOC(S): そのクローンセットに含まれるコード片がどの程度異なるクラスに散らばって いるか表す 例: クローンセット S は10個のコード片を含んでいるとする 全てのコード片が異なるクラスにある場合, – DOC(S) = ( 10 – 1) / (10 – 1) = 1 5つのクラスにコード片がある場合, – DOC(S) = (5 – 1) / (10 – 1) = 0.44 2つのクラスにコード片がある場合, – DOC(S) = (2 – 1) / (10 -1) = 0.11 全てのコード片が同一のクラスにある場合, – DOC(S) = (1 -1) / (10 -1) = 0 POPの値が大きいクローンセットに対して有効 全てのコード片を1つにまとめるのは難しい Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 58 Aries - その他のメトリクス2(SMT) SMT(S): そのクローンセットに含まれる(メソッド単位の)コード片の返り値,引数の型が どの程度一致するかを表す 現在の”一致”の定義 プリミティブ型の場合, – まったく同一である時 オブジェクト型の場合, – 同一の型もしくは,異なっていても共通の親クラスをもつオブジェクト型の時 例: メソッドAとメソッドBはクローンになっており(クローンセット S) ,それぞれ引数の 数は4つである. 全ての引数と返り値の型が一致する場合 – SMT(S) = (4 + 1) / (4 + 1) = 1 二つの引数の型が一致する場合 – SMT(S) = 2 / (4 + 1) = 0.4 全ての引数と返り値の型が一致しない場合 – SMT(S) = 0 / (4 + 1) = 0 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 59 Aries - その他のメトリクス3(KMC) KMC(S): そのクローンセットに含まれるコード片が存在するメソッドが, 他のメソッドとどの程度結合しているかを表す 結合は以下の三種類で計る メソッド呼び出しの引数 メソッド呼び出しの返り値 メソッド間の共有変数 KMC(S)の値が大きい メソッド間の結合度が大きい リファクタリングすべき? Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 60
© Copyright 2024 ExpyDoc