プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法

Slides:



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

背景 ソフトウェアの大規模化・複雑化 生産性と品質の向上 ↓ オブジェクト指向分析設計の適用 開発ツールの投入.
研究の背景 コードクローン ソースコード中に存在する一致または類似したコード片
データフロー情報を用いたコード ナビゲーションツールの実装と評価
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
ソースコードに対する適用可能な修正手順を 可視化するリファクタリング支援手法の提案
CKメトリクスを用いてリファクタリングの 効果を予測する手法の提案
プログラム実行履歴を用いたトランザクションファンクション抽出手法
大規模ソースコード集合を対象とした 類似関数集合群の抽出
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
ギャップを含むコードクローンの フィルタリング手法の提案
同一メソッド内に含まれる ブロック間の結合度を用いた メソッド分割手法の提案
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の共起関係に基づく類似コード検索法の提案と 欠陥検出への適用
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
ソードコードの編集に基づいた コードクローンの分類とその分析システム
コードクローンの分類に基づいた メソッド引き上げ手順の提案とその有効性評価
リファクタリング中に生じる コンパイルエラーの自動解消手法
動的依存グラフの3-gramを用いた 実行トレースの比較手法
コード片の生存期間がコードクローンと欠陥修正の有無に与える影響分析
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
CKメトリクスに基づくリファクタリングの 効果予測手法の提案と実装
ソフトウェアメトリクスと メソッド内の構造を用いた リファクタリング支援手法の提案
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
クローンセットに対する主要編集者の分析法の提案と調査
限られた保存領域を使用する Javaプログラムの実行トレース記録手法の 提案と評価
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードの生存期間を考慮したコードクローンと欠陥修正の関係調査
コードクローンの動作を比較するためのコードクローン周辺コードの解析
UMLモデルを対象とした リファクタリング候補検出の試み
Javaバイトコードの 動的依存解析情報を用いた スライシングシステムの実現
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
コードスメルの深刻度がリファクタリングの実施に与える影響の実証的研究
Javaソフトウェア部品検索システムSPARS-Jの実験的評価
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
コーディングパターンの あいまい検索の提案と実装
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
ソフトウェアプロダクト集合に対する 派生関係木の構築
設計情報の再利用を目的とした UML図の自動推薦ツール
依存関係の局所性を利用した プログラム依存グラフの 効率的な構築法
保守請負時を対象とした 労力見積のためのメトリクスの提案
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
オープンソースソフトウェアに対する コーディングパターン分析の適用
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
UMLモデルを対象とした リファクタリング候補検出手法の提案と実現
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
コードクローン解析に基づく デザインパターン適用候補の検出手法
回帰テストにおける実行系列の差分の効率的な検出手法
メソッド抽出リファクタリングが 行われるメソッドの特徴調査
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
オブジェクト指向メトリクスを用いた 開発支援に関する研究 --- VC++とMFCを用いた開発を対象として ---
プログラム理解のための 付加注釈 DocumentTag の提案
プログラム依存グラフを用いた ソースコードのパターン違反検出法
コードクローンを対象とした リファクタリングの有効性に関する調査
Presentation transcript:

プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法 井上研究室  後藤 祥

リファクタリング ソフトウェアの内部構造を整理すること Template Method の形成 [1] 外部から見た振る舞いは保つ 保守性や可読性の向上 Template Method の形成 [1] 差分を含む類似メソッドを親クラスへと集約する [1] M. Fowler. Refactoring: Improving the Design of Existing Code, Addison Wesley, 1999.

適用例 親クラスに集約 getBillableAmount() getBillableAmount() getBaseAmount() Site getBillableAmount() ResidentialSite LifelineSite getBillableAmount() getBaseAmount() getBillableAmount() getBaseAmount() 類似メソッドが完全一致するように 差分を各子クラスにメソッドとして抽出 差分を含む類似メソッド

Template Method の形成 における問題点 子クラスに抽出するメソッドの範囲の選択が困難 1 : 抽出後に類似メソッドが一致する 2 : 凝集度が高くなるよう抽出する (保守性,可読性の向上) コードを読んで処理のまとまりを見つけるのは難しい if(finalBuffer.remaining() < 8) { while(finalBuffer.remaining() > 0) { finalBuffer.put((byte)0); } finalBuffer.position(0); transform(finalBuffer); if(finalBuffer.remaining() < 8) { while(finalBuffer.remaining() > 0) { finalBuffer.put((byte)0); } finalBuffer.position(0); transform(finalBuffer.array(),0);

既存研究 井岡らの手法 [2] 凝集度メトリクス COB を用いて候補を順位付け 類似メソッドの集約候補を検出して提示 凝集度の高い候補から先に利用者に提示する 利用者の候補選択の作業を支援する [2] Masakazu Ioka et al. : "A Tool Support to Merge Similar Methods  with a Cohesion Metric COB", IWESEP, 2011.

プログラムスライスを用いた凝集度メトリクスを使用して 凝集度メトリクス COB コード中のブロック間の協調関係から凝集度を算出 ブロック間で変数が多く共有されているとき凝集度が高い 計算が容易である 問題点:ブロック単位の凝集度しか測ることができない プログラムスライスを用いた凝集度メトリクスを使用して 問題の解決を図る 1 2 3 4 5 6 7 8 BLOCK1 { A = getPrice(); B = A * DISCOUNT_RATE; } BLOCK2 { C = B * TAX_RATE; return C; 変数 C の値を計算する一連の処理 変数 B のみが共有 COB は低い 凝集度は高い

プログラムスライス ある基準と依存関係のある文の集合 基準 ・・・ プログラム中の変数と文の組 前向きスライスと後ろ向きスライスがある {2,a} 前向きスライス int max(int a, int b){ int v1 = a; int v2 = b; int max = v1; if(v2 > max) max = v2; return max; } 1 2 3 4 5 6 7 8 基準が影響を与える文の集合 2 4 5 6 7

プログラムスライス ある基準と依存関係のある文の集合 基準 ・・・ プログラム中の変数と文の組 前向きスライスと後ろ向きスライスがある int max(int a, int b){ int v1 = a; int v2 = b; int max = v1; if(v2 > max) max = v2; return max; } 1 2 3 4 5 6 7 8 基準に影響を与える文の集合 2 4 5 6 7 3 基準 {7,max}

プログラムスライスを用いた 凝集度メトリクス プログラムスライスを用いて凝集度を求める 出力変数を基準とした後ろ向きスライスを用いる 文間の依存関係を使用して凝集度を求める 文単位で凝集度を測ることができる 1 2 3 4 5 6 7 8 BLOCK1 { A = getPrice(); B = A * DISCOUNT_RATE; } BLOCK2 { C = B * TAX_RATE; return C; 後ろ向きスライス プログラムスライスを用いた メトリクスの値は高い 多くの文が協調して ひとつの機能を実現している 2 3 6 7 出力変数

提案手法 プログラムスライスを用いた凝集度メトリクスを使用して集約候補の順位付けを行う 既存のメトリクスを応用して使用する 既存研究より良い候補を上位に順位付けすることができる 既存のメトリクスを応用して使用する 出力変数だけでなく引数を用いて計算する 引数を基準とした前向きスライスを用いる

引数とそれを最初に参照する文を基準として 提案手法で用いるメトリクス 積集合と各スライスの要素数の比を計算 その平均値を凝集度とする 全てのスライスの積集合を計算 返り値と return 文を基準として 後ろ向きスライスを計算 引数とそれを最初に参照する文を基準として 前向きスライスを計算 2 4 5 6 7 基準 {2,a} {3,b} int max(int a, int b){ int v1 = a; int v2 = b; int max = v1; if(v2 > max) max = v2; return max; } 1 2 3 4 5 6 7 8 0.617 凝集度 平均 積集合 3 5 5 6 7 3 4 3 5 6 7 基準 {7,max} 3 6 2 4 5 6 7 3

プログラムスライスを用いた凝集度メトリクスを使用 提案手法の流れ 順位付けされた 集約候補 集約候補 . . 1 2 4 3 利用者 既存ツール プログラムスライスを用いた凝集度メトリクスを使用

集約候補に対する凝集度の計算 類似メソッド メソッドとして 抽出するコード片 各コード片の凝集度 0.7 0.3 0.3 0.8 平均値を計算 集約候補の凝集度 0.525

リファクタリング後のメソッドの凝集度が高い 集約候補の順位付け リファクタリング後のメソッドの凝集度が高い 1 2 4 3 0.2 0.8 0.3 0.5 凝集度の値が高いものを上位に順位付け 凝集度を計算

適用実験 オープンソースソフトウェア上の類似メソッドに提案手法を適用 適用結果をもとに評価アンケートを実施 アンケート内容 被験者はコンピュータサイエンス専攻の学生 アンケート内容 上位10候補を被験者へ提示 提示された候補のうち良い候補と思うものを選択 (複数可)

実験対象 Ant プロジェクト Antlr プロジェクト Azureus プロジェクト Arc クラス executeDrawOperation メソッド Ellipse クラス executeDrawOperation メソッド Antlr プロジェクト CppCodeGenerator クラス genErrorHandler メソッド JavaCodeGenerator クラス genErrorHandler メソッド Azureus プロジェクト MD5 クラス digest メソッド SHA1 クラス digest メソッド

評価方法 評価尺度1 : 被験者の候補選択率 評価尺度2 : 平均候補選択率 1つ以上の候補を選択した被験者の割合 多くの被験者へ良い候補を提示できているか 評価尺度2 : 平均候補選択率 提示した候補のうち被験者に選択された候補の割合 上位10候補にどれだけ良い候補が含まれているか

被験者の候補選択率 3つ中2つの結果で 提案手法の方が良い 8割程度の被験者が 1つ以上候補を選択

平均候補選択率 上位10件のうち 2割以上の候補が 良い候補と判定

まとめと今後の課題 まとめ 今後の課題 プログラムスライスを用いた凝集度メトリクスを使用して集約候補の順位付けを行った 既存手法より有用な集約候補を上位にできた 他のプログラムスライスを用いたメトリクスの結果も良い結果となった 今後の課題 ソフトウェア開発者へのアンケートの実施