メソッド抽出リファクタリングが 行われるメソッドの特徴調査 ○ 後藤 祥1,吉田 則裕2 ,藤原 賢二2 崔 恩瀞1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 研究概要 • メソッド抽出が行われるメソッドの特徴を調査 – オープンソースソフトウェアからメソッド抽出の履歴 を収集 – 開発者がどのようなメソッドを対象としているか • 一般的なメソッドの特徴と比較 – メソッドのサイズ,凝集度に有意な差が存在した 1 Department of Computer Science, Graduate School of Information Science and Technology, Osaka University リファクタリング • プログラムの外的振る舞いを変化させずに, 内部構造を整理すること [1] – 様々な種類のリファクタリングが存在する • 保守性や可読性の向上を目的として行う [1] M. Fowler, “Refactoring : Improving the Design of Existing Code”, 1999. Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 2 メソッド抽出リファクタリング • メソッドの一部を新たなメソッドとして抽出するリ ファクタリング • 主な用途 – 長いメソッドを短いメソッドに分割する – 複数の機能を持つメソッドを機能単位に分割する 3 Department of Computer Science, Graduate School of Information Science and Technology, Osaka University メソッド抽出の例(1/2) • 1-10までの成績を並び替えて表示するプログラム int[] score = {9,4,8,2,3,10,7,1,6,5}; for(int i=0;i<score.length-1;i++){ for(int j=0;j<score.length-i-1;j++){ if(score[j] < score[j+1]){ int t = score[j]; score[j] = score[j+1]; score[j+1] = t; } } } for(int i=0;i<score.length;i++){ System.out.println(score[i]); } データの入力 ソート データの出力 4 Department of Computer Science, Graduate School of Information Science and Technology, Osaka University メソッド抽出の例(2/2) • 1-10までの成績を並び替えて表示するプログラム ソート部分をメソッド抽出 int[] score = {9,4,8,2,3,10,7,1,6,5}; sort(score); for(int i=0;i<score.length;i++){ System.out.println(score[i]); } public void sort(int[] score){ for(int i=0;i<score.length-1;i++){ for(int j=0;j<score.length-i-1;j++){ if(score[j] < score[j+1]){ int t = score[j]; score[j] = score[j+1]; score[j+1] = t; } } } } ソート部分がsortメソッドに置き換わり, プログラムの可読性が向上した. 機能単位に分割されたことで,バグ修 正などの保守作業が容易になった. Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 5 リファクタリング支援の研究 • 開発履歴の調査と支援手法の提案 1 開発履歴の調査 開発履歴 開発者 2 調査結果に基づく 支援手法・ツールの提案 Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 研究者 6 既存の調査研究 • 既存の調査の内容 [2] – どの種類のリファクタリングが行われているか? – 開発者がどのようにツールを使っているか? • コードの特徴の定量的調査は行われていない – コードの特徴 ・・・ 行数,複雑度など – リファクタリングされるコードの特徴を調べることで, リファクタリング対象の推薦ができる [2] E. Murphy-Hill et al., “How We Refactor, and How We Know It”, 2012 Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 7 研究概要 • メソッド抽出リファクタリングの定量的調査 – メソッド抽出されたメソッドと一般的なメソッドの特 徴を比較する • 調査する特徴:長さ,凝集度 – 凝集度 ・・・ 機能的なまとまりを表す度合 – 抽出の対象となるのは長いメソッドや機能単位で まとまっていないメソッドと言われている [1] [1] M. Fowler, “Refactoring : Improving the Design of Existing Code”, 1999. Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 8 調査手順 • メソッド抽出されたメソッドとリリースバージョン の全メソッドを比較 開発履歴 Extracted リファクタリング 検出ツール メソッド抽出事例 抽出対象となった メソッドの特徴 All 最新の リリースバージョン Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 全メソッドの特徴 9 メソッド抽出事例の検出 • 本研究では藤原らのツールを使用 メリット 藤原らの ツール[3] ・複数リビジョンから 一度に検出が可能 ・高速・高精度 Ref-Finder[4] ・複数の種類のリファ UMLDiff[5] クタリングを検出可能 デメリット ・対象はメソッド抽出 リファクタリングのみ ・一度に検出ができる のは2リビジョン間のみ [3] 藤原ら, “構文情報を付加したリポジトリによるメソッド抽出リファクタリングの検出”, 2013. [4] K. prete et al., “Template-based Reconstruction of Complex Refactorings”, 2010. [5] Z. Xing et al., “Refactoring Detection based on UMLDiff Change-Facts Queries”, 2006. Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 10 藤原らのツールの検出手順 リビジョン N void printOwing(){ printBanner(); System.out.println("name: " + _name); System.out.println("amount: " + getOutstanding()); } リビジョン N + 1 void printOwing(){ printBanner(); printDetails(getOutstanding()); } 条件1 : 行の追加および削除が行われた 削除された行 メソッドが存在する System.out.println("name: " + _name); System.out.println("amount: " + getOutstanding()); 条件3 : 新たに追加されたメソッドを 呼び出している 類似度が閾値(0.3)以上であれば void printDetails(double outstanding){ 条件2 : 新たに追加された メソッド抽出が行われたとする. System.out.println("name: " + _name); メソッドが存在する System.out.println("amount: " + outstanding); } 11 Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 調査するメトリクス • メソッドの長さと凝集度を表すメトリクス – 長さを測るメトリクス1つ – 凝集度を測るメトリクス3つ メソッドの長さ メソッドの凝集度 メソッド中の文数 (Number Of Statements : NOS) スライスベースの凝集度メトリクス Tightness, Coverage, Overlap 12 Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 凝集度メトリクス • スライスベースの凝集度メトリクス [6] – プログラムスライスを用いて凝集度を計測する – メソッドの出力変数に着目したメトリクス – 0から1の範囲の実数値で値が高いほど凝集度が高い • Tsantalisらの定義に従って計算する [7] – 出力変数 ・・・ メソッド本体とスコープが一致する変数 – 出力変数が存在しないメソッドの凝集度は計算できない [6] M. Weiser, “Program slicing”, 1981. [7] N. Tsantalis et al., “Identification of extract method refactoring opportunities for the decomposition of methods”, 2011. Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 13 プログラム依存グラフ(PDG) • プログラム中の依存関係を表したグラフ – 頂点は文,辺は依存関係を表す 1 int factorial(int a){ 2 int result = 1; 3 int i; 4 for(i = a;1 < i;i--){ result *= i; 5 6 } 7 8 return result; 9 } 2 3 4 文 制御文 5 データ依存辺 8 制御依存辺 PDG 14 Department of Computer Science, Graduate School of Information Science and Technology, Osaka University プログラムスライス • スライス基準(文と変数の組)と関連する文の集合 – 基準から後ろ向きに辺をたどって得られる集合を後ろ 向きスライスという 1 int factorial(int a){ 2 int result = 1; 3 int i; 4 for(i = a;1 < i;i--){ result *= i; 5 6 } 7 8 return result; 9 } 2 3 4 5 スライシング基準 : <5, result> 後ろ向きスライス : {3,4,5} 8 15 Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 凝集度の計算例 SL SLiint SLSL result int 11 SL Coverage 0.6 スライスの積集合 ) ) 0.80.8 Overlap (( Tightness M M 22 M SLi SLresult int SLi SLresult SLint 1 int factorial(int a){ 2 int result = 1; 3 int i; 4 for(i = a;1 < i;i--){ result *= i; 5 6 } 7 8 return result; 9 } | | | | | | | | | | 出力変数の後ろ向き 出力変数のスライスが スライスを計算 出力変数のスライスが 全ての出力変数に関わる どの程度メソッド全体に 文がどの程度存在するか どの程度重複しているか 広がっているか | 16 Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 調査対象のメソッド • NOSの比較には全メソッドを使用 • 凝集度の比較には凝集度が計算できたメソッ ドのみを使用(表中の括弧内数) メソッド抽出事例数 比較用バージョン メソッド数 jEdit 490(286) 4.5.0 6275(2114) ArgoUML 659(302) 1.8.4 9123(2167) Apache Ant 704(322) 0.34 13840(4457) 17 Department of Computer Science, Graduate School of Information Science and Technology, Osaka University NOS分布 • 抽出対象のメソッドはNOSが多い 5 10 20 1 2 NOS NOS 100 500 ‒ 有意水準0.05で有意差あり リリース 抽出 jEdit リリース 抽出 Ant リリース 抽出 ArgoUML Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 18 凝集度の比較結果 • 3つの対象ソフトウェアで近い結果 – 抽出対象のメソッドは凝集度が低い • メトリクスごとの結果について説明 – Antに対する結果のみ 19 Department of Computer Science, Graduate School of Information Science and Technology, Osaka University Tightness 分布 0.5 0.0 凝集度 Cohesion 1.0 • 全てのソフトウェアで有意差ありの検定結果 • 抽出されるのは0.2以下の値のメソッドが多い リリース 抽出 Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 20 Coverage 分布 0.5 0.0 凝集度 Cohesion 1.0 • jEditのみ有意差なしの検定結果 • Tightnessに値の分布が近い リリース 抽出 Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 21 Overlap 分布 0.5 0.0 凝集度 Cohesion 1.0 • 全てのソフトウェアで有意差ありの検定結果 • 値の分布が広い • 値が1となるメソッドが非常に多い リリース 抽出 Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 22 調査結果のまとめ • 抽出対象のメソッドはNOSが多く凝集度が低い – 長く,機能的まとまりのないメソッドが対象になる 有意差 NOS あり Tightness あり Coverage Overlap jEditのみなし あり 比較調査の結果 抽出対象となるメソッドはNOSが多い 抽出対象となるメソッドは値が0.2以下 のメソッドが多い 差が小さく有意差がない場合もある 有意差はあるが値の分布が特徴的 23 Department of Computer Science, Graduate School of Information Science and Technology, Osaka University まとめ • 抽出対象となるメソッドの特徴を調査 ‒ 3つのソフトウェアを対象に調査 ‒ リリース版に存在するメソッドと特徴を比較 • 抽出対象となるメソッドは文数が多く,凝集度 が低い ‒ 検定によって有意な差がみられた 24 Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 今後の課題 • より大規模な調査の実施 – 対象ソフトウェア,メトリクス(複雑度など)を追加し た調査 • メソッド抽出候補の推薦手法の提案 – 調査した特徴の差異を利用する 25 Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
© Copyright 2024 ExpyDoc