ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法

Slides:



Advertisements
Similar presentations
シーケンス図の生成のための実行履歴圧縮手法
Advertisements

背景 ソフトウェアの大規模化・複雑化 生産性と品質の向上 ↓ オブジェクト指向分析設計の適用 開発ツールの投入.
High-Impact Defects: A Study of Breakage and Surprise Defects
TF-IDF法とLSHアルゴリズムを用いた 関数単位のコードクローン検出法
組み合わせて実施された リファクタリングの調査
剽窃 他人の作品や論文を盗んで,自分のものとして発表すること. プログラムが剽窃される事例もある. Aさんのプログラム Xさんのプログラム
変数間データフローグラフを用いた ソースコード間の移動支援
F11: Analysis III (このセッションは論文2本です)
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
CKメトリクスを用いてリファクタリングの 効果を予測する手法の提案
プログラム実行履歴を用いたトランザクションファンクション抽出手法
プログラム実行時情報を用いたトランザクションファンクション抽出手法
メトリクス計測 プラグインプラットフォームMASUの開発
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
静的情報と動的情報を用いた プログラムスライス計算法
同一メソッド内に含まれる ブロック間の結合度を用いた メソッド分割手法の提案
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
オブジェクト指向メトリクスを用いた 開発支援法に関する研究
CKメトリクスに基づくリファクタリングの 効果予測手法の提案と実装
ソフトウェアを取り巻く環境の変化がメトリクスに及ぼす影響について
ソフトウェアメトリクスと メソッド内の構造を用いた リファクタリング支援手法の提案
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
クローンセットに対する主要編集者の分析法の提案と調査
重複コードと非重複コードにおける 修正頻度の比較
Javaプログラムの変更を支援する 影響波及解析システム
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
プログラム動作理解支援を目的とした オブジェクトの振舞いの同値分割手法
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードクローンの動作を比較するためのコードクローン周辺コードの解析
ソースコードの静的特性を用いた Javaプログラム間類似度測定ツールの試作
UMLモデルを対象とした リファクタリング候補検出の試み
Javaバイトコードの 動的依存解析情報を用いた スライシングシステムの実現
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
コードスメルの深刻度がリファクタリングの実施に与える影響の実証的研究
Javaソフトウェア部品検索システムSPARS-Jの実験的評価
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
ソフトウェアプロダクト集合に対する 派生関係木の構築
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
保守請負時を対象とした 労力見積のためのメトリクスの提案
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
A-17 検索履歴のプライバシーを秘匿した ユーザクラスタリング
開発作業の形式化に基づく プロセス評価 松下誠 大阪大学.
オブジェクト指向開発における フォールト発生早期予測手法の 一提案
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
複雑度メトリクスを用いた JAVAプログラム品質特性の実験的評価
コードクローン解析に基づく デザインパターン適用候補の検出手法
回帰テストにおける実行系列の差分の効率的な検出手法
メソッド抽出リファクタリングが 行われるメソッドの特徴調査
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
オブジェクト指向メトリクスを用いた 開発支援に関する研究 --- VC++とMFCを用いた開発を対象として ---
プログラム理解のための 付加注釈 DocumentTag の提案
プログラム依存グラフを用いた ソースコードのパターン違反検出法
コードクローンを対象とした リファクタリングの有効性に関する調査
Presentation transcript:

ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法 井上研究室 後藤 祥

メソッド抽出リファクタリング メソッドの一部を新たなメソッドとして抽出するリファクタリングパターン 主な用途 頻繁に行われるリファクタリングパターンの1つ 主な用途 行数の長いメソッドを短いメソッドに分割する 複数の機能が実装されたメソッドを機能単位に分割する

メソッド抽出の例(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]); ソート

メソッド抽出の例(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; } メソッド名から処理内容を 把握することができる. ソート処理を行っている 部分が特定できる.

リファクタリング対象の推薦 対象を自動で特定して開発者に推薦する Bad Smell(リファクタリングが推奨されるコード) Long Method, Duplicated Code リファクタリング対象 のリスト リファクタリング対象の 特定・推薦ツール ソースコード

推薦における問題点 ? ? プロジェクトや開発者による基準の違い 多くのツールはパラメータ設定によって対応 パラメータ設定はあまり変更されない [2] 設定値から結果を想定するのは困難 ? ? メソッド内の文の最小数は? 重複する文の最大数は? JDeodorant [3] [2] E. Murphy-Hill et al. “How We Refactor, and How We Know It”, IEEE Trans. on Softw. Eng., 2011. [3] jDeodorant : http://www.jdeodorant.com/

提案手法 機械学習を用いたメソッド抽出リファクタリングの推薦 機械学習を用いることの利点 過去にリファクタリングが行われた事例から,ソースコードの特徴量を抽出し,学習を行う 機械学習を用いることの利点 プロジェクトごとの基準を反映させることができる 他のリファクタリングパターンへの拡張性がある

提案手法の概要 Step 3 : 機械学習を用いて予測モデルを構築 Step 2 : 収集したメソッドを解析して特徴量を計測 抽出が行われたメソッドと行われなかったメソッドを収集 特徴量1 特徴量2 特徴量N ・・・ 抽出対象である 抽出対象でない 抽出有メソッド 抽出無メソッド 特徴量1 特徴量2 特徴量N ・・・ 予測モデル 開発履歴

Step 1 : メソッド抽出事例の収集 リファクタリング検出ツールを使用して収集 開発履歴中から,リファクタリングが適用された箇所を検出するツール 藤原らが提案しているリファクタリング検出ツールを使用 [4] 高速かつ高精度で検出が可能 [4] 藤原ら “ソフトウェアリポジトリを対象とした細粒度リファクタリング検出”, 第20回ソフトウェア工学の基礎ワークショップ, 2013.

Step 2 : 特徴量の計測 カテゴリ 特徴量 サイズ メソッド中の文数 シグネチャ 引数の数,返り値の有無,アクセスレベル 凝集度 Tightness, Coverage, Overlap 複雑度 サイクロマチック数 構文 ループ数,if文数,case文数 ブロック数,ネストの深さの最大値 変数 メソッド内のローカル変数の数 CKメトリクス WMC, DIT, CBO, NOC, RFC, LCOM 重複コード メソッド内の重複コードが存在するか

Step 3 : 予測モデルの構築 データマイニングツール Weka を使用 [5] モデル構築前に変数選択を行う モデルは3種類使用 多くの機械学習アルゴリズムが実装されている モデル構築前に変数選択を行う 変数減少法,ラッパー法 モデルは3種類使用 ロジスティック回帰,決定木,ベイジアンネット [5] weka : http://www.cs.waikato.ac.nz/ml/weka/

データセット中のメソッド数 (抽出有 : 抽出無) 実験概要 予測モデルの評価と有用な特徴量の調査 5つのソフトウェアに提案手法を適用 ソフトウェア メソッド抽出事例数 データセット中のメソッド数 (抽出有 : 抽出無) Ant 766 1532 (766 : 766) ArgoUML 740 1480 (740 : 740) jEdit 502 1004 (502 : 502) jFreeChart 90 180 (90 : 90) Mylyn 490 980 (490 : 490)

実験方法 モデルの構築,評価に交差検定を用いる 評価セットの割合を変化させる データセットを学習セットと評価セットに分割 50:50 評価セットの割合 (抽出有 : 抽出無) 50:50 40:60 30:70 20:80 10:90

評価尺度 Precision Recall 推薦されたメソッドのうち,抽出が行われたメソッドの割合 データセット中の抽出が行われたメソッドのうち,モデルによって推薦されたメソッドの割合

実験結果 : Precision 比較用のベースライン ランダム(50%)で分類するモデル

実験結果 : Recall

実験結果 : 特徴量 変数選択によって選択された回数をもとに,有用な特徴量を調査 特徴量 選択された回数(最大15回) メソッドの文数 13 凝集度メトリクス Coverage メソッドの引数の数 12 サイクロマチック複雑度 7 凝集度メトリクス Overlap 6 case 文数  ・・・

考察 全ての場合でベースラインより良い結果 Recallに変化はないがPrecisionは減少する 特徴量による学習の効果があった 特徴量の追加,開発者ごとにデータを分割する

まとめ 機械学習を用いたメソッド抽出リファクタリングの推薦手法を提案 オープンソースのソフトウェアを対象に実験 メソッド抽出が行われたメソッドの6割から9割は推薦することができた 実用のためにはさらなる精度の改善が必要