同一メソッド内に含まれる ブロック間の結合度を用いた メソッド分割手法の提案

Slides:



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

XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
情報伝播によるオブジェクト指向プログラム理解支援の提案
アクセス修飾子過剰性の変遷に着目したJavaプログラム部品の分析
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
Object Group ANalizer Graduate School of Information Science and Technology, Osaka University OGAN visualizes representative interactions between a pair.
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
ソースコードに対する適用可能な修正手順を 可視化するリファクタリング支援手法の提案
プログラム実行履歴を用いたトランザクションファンクション抽出手法
プログラム実行時情報を用いたトランザクションファンクション抽出手法
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
静的情報と動的情報を用いた プログラムスライス計算法
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
コーディングパターンと キーワードを用いて生成したコードスニペットの推薦
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
ソフトウェアデザイン工学 EPMの適用結果報告
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
ソードコードの編集に基づいた コードクローンの分類とその分析システム
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
動的スライスを用いた バグ修正前後の実行系列の比較
コードクローンの分類に基づいた メソッド引き上げ手順の提案とその有効性評価
動的依存グラフの3-gramを用いた 実行トレースの比較手法
ポインタ解析におけるライブラリの スタブコードへの置換の効果
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
ソフトウェアメトリクスと メソッド内の構造を用いた リファクタリング支援手法の提案
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
社会シミュレーションのための モデル作成環境
Disclosure of conflict of interest
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
オープンソース開発支援のための ソースコード及びメールの履歴対応表示システム
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
コードクローンの動作を比較するためのコードクローン周辺コードの解析
UMLモデルを対象とした リファクタリング候補検出の試み
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
プログラム理解におけるThin sliceの 統計的調査による有用性評価
コード片に共通した特性を自動抽出する ソースコード閲覧ツールの試作
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
既存ソフトウェア中の 頻出コード片を用いた コード補完手法の提案
コーディングパターンの あいまい検索の提案と実装
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
コードクローンの分布情報を用いた特徴抽出手法の提案
3.1 ifステートメント 3.2 if-elseステートメント 3.3 コードのブロック 11月14日(金) 発表者:藤井丈明
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
ソフトウェア工学 知能情報学部 新田直也.
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
保守請負時を対象とした 労力見積のためのメトリクスの提案
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
オープンソースソフトウェアに対する コーディングパターン分析の適用
ソフトウェア理解支援を目的とした 辞書の作成法
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
コードクローン解析に基づく デザインパターン適用候補の検出手法
回帰テストにおける実行系列の差分の効率的な検出手法
メソッド抽出リファクタリングが 行われるメソッドの特徴調査
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
アノテーションガイドラインの管理を行う アノテーションシステムの提案
プログラム依存グラフを用いた ソースコードのパターン違反検出法
Presentation transcript:

同一メソッド内に含まれる ブロック間の結合度を用いた メソッド分割手法の提案 井上研究室 M2 三宅達也 一部に対応した説明

研究概要 ソフトウェアの設計品質を高く保つことが重要 ⇒ソフトウェアの設計品質を向上させるための技術  ⇒ソフトウェアの設計品質を向上させるための技術 メソッド抽出リファクタリングを支援する手法の提案 2018/11/22

メソッド抽出リファクタリング メソッド内のコードの一部を新規メソッドとして抽出 メソッド抽出リファクタリングの手順 既存の1つのメソッドを2つの短いメソッドに分割 メソッド抽出リファクタリングの手順 メソッド抽出リファクタリングを必要とするメソッドを特定 新規メソッドとして抽出する範囲を識別 識別範囲をメソッドとして抽出 プログラムの振る舞いが変わっていないか検証 2018/11/22

メソッド抽出の例と特徴 短いメソッドを形成する 他のメソッドから利用しやすい 適切な命名を行うことで、内部の処理の理解が容易になる public void sample ( ) { int i = 0; while( hoge() ) { String str = “string”; if( jar( i ) ) { make(str); } for( int j = 0; j < i ; j++) { sam( i ); if( log ) { System.out.println(str); while( ) { bar(i); public void sample ( ) { int i = 0; while( hoge() ) { printStr(i); } while( ) { bar(i); public void printStr(int i) { String str = “string”; if( jar( i ) ) { make(str); for( int j = 0; j < i ; j++) { sam( i ); if( log ) { System.out.println(str); 短いメソッドを形成する 他のメソッドから利用しやすい 再利用性の向上 重複コードの生成防止 適切な命名を行うことで、内部の処理の理解が容易になる 可読性の向上 オーバライドが行いやすい 拡張性の向上 抽出 メソッド抽出の例 リファクタリングの説明とか問題点とかいらん 2018/11/22

研究の動機と目的 研究動機 メソッド抽出リファクタリングは ⇒自動化の効果が大きい 研究目的 さまざまな利点を持つ  メソッド抽出リファクタリングは さまざまな利点を持つ 頻繁に行われる普遍的な作業 他の品質向上作業の前準備   ⇒自動化の効果が大きい  研究目的 メソッド抽出リファクタリングを支援する手法を提案 新規メソッドとして抽出すべき範囲を自動的に特定 2018/11/22

適切なメソッド抽出 機能に基づいて分割されたメソッド 引数の少ないメソッド ⇒ 凝集度の高いメソッド 機能:1つのメソッドが実現する特定の処理 引数の少ないメソッド 呼び出し元のメソッドとの依存関係が小さい 引数の役割が理解しやすい ⇒ 凝集度の高いメソッド メソッドの構成要素が協調 メソッドが適切に役割分担されている メソッド内の構成要素が密結合 メソッド内部と外部の要素は疎結合 2018/11/22

新規メソッドとして抽出するコードブロック群 提案手法の概要 新規メソッドとして抽出する範囲を自動的に識別 メソッド内のコードが実現する機能を変数集合で表現 コードブロック間の結合度を定義 互いに強く結合しているコードブロック群を識別 新規メソッドとして抽出するコードブロック群 2018/11/22

変数を用いた機能の表現 メソッドの機能:変数の値を決定するための計算[23] ⇒コード片B の機能を変数集合V(B) で表す 変数を指定することはメソッドの機能を指定することと同義 過去の研究では返り値のみに着目 提案手法ではメソッド内で使用されている全変数に着目 ⇒コード片B の機能を変数集合V(B) で表す 下の機能をいいかえる Vを機能という 使用している->出現している [23]丸山.基本ブロックスライシングを用いたメソッド抽出リファクタリング. 情報処理学会論文誌43(6):1625-1637, Jun 2002. 2018/11/22

コード片の協調度合 変数集合の共通要素が要素数の少ない変数集合を占める割合 協調度合が高いとき2つのコード片は同一の機能を実現するためのコード片である可能性が高い 共通要素の数 要素数の少ない変数集合の要素数 ここでいう機能もやばい 機能という言葉の矛盾 機能->関心事 2018/11/22

コードブロック間の関係 兄弟関係 親子関係 sample ( ) while while if for if public void sample ( ) { int i = 0; String str; while( hoge() ) { str = “string”; if( jar( I ) ) { make(str); } foo(i); for( int j = 0; j < I ; j++) { sam( i ); if( log ) { System.out.println(i); ・ while( ) { bar(i); sample ( ) while while if for 兄弟関係 親子関係 if 2018/11/22

兄弟ブロック結合 兄弟関係にあるコードブロック間の結合度 兄弟ブロック結合度が閾値以上 兄弟関係にあるコードブロックの機能の協調度合 B1とB2が兄弟関係にある時 兄弟ブロック結合度が閾値以上 2つのコードブロックを1つのメソッドとして抽出 2018/11/22

親子ブロック結合 親子関係にあるコードブロック間の結合度 親子ブロック結合度が閾値以上 子コードブロック  の機能と  をメソッド抽出した後に残る親コードブロック   の機能の協調度合 親子ブロック結合度が閾値以上 子コードブロックだけでなく親コードブロックごとメソッド抽出 2018/11/22

同一機能に属するコードブロック群識別アルゴリズム RESULT = NULL B = 特定されたコードブロック SCB = B と結合しているコードブロック群(Bを含む) NSCB = B と兄弟ブロック結合していないコードブロック群 PB = Bの親コードブロック文 if ( NSCB が空でない) if ( PBC( PB, SCB ) > PBC( PB, NSCB ) ) NSCBを新規メソッドとして抽出 else SCBを新規メソッドとして抽出 EXIT end if if ( PBとSCBが親子ブロック結合している ) if ( PBがメソッド全体でない ) B = PB GOTO 行3 同一変 2018/11/22

同一機能に属するブロック文群識別の例(閾値: 0.5) void METHOD() { VAR v1, v2, v3, v4, v5; …………………………… BLOCK1 { BLOCK2 { VAR v8 = v1 + v2; v6 = v3 + v8; v7 = v4 + v8; } VAR v9 = 0; BLOCK3 { v9 = v1 + v2 + v6; v5 = v7 + v9 BLOCK4 { BLOCK5 { VAR v12, v13, v14; v9 = v12 + v13 + v14; SBC: 0.75 PBC: 0.66 SBC: 0.25 2018/11/22

適用事例 対象 If1,for3,for4が同一の機能を実現するためのコードブロック群 学生の書いたプログラム 主観的判断 コードコメント 再利用可能な機能的単位 for3 for4 りふぁくぐたリングを実行してテスト As a preliminary case study, we applied our method to a program written by a undergraduate student. In the interest of saving time, I show only one code fragments indentified by our method. This figure represent the code fragment, in this code fragment our method identified this “for-statement” and the surrounding code that are highlighted in gray as the target of “extract method”. In this “for-statement”, the number of available outer variables is 13, however, the number of really used outer variables is only 3. That means the vertical coupling between this “for-statement” and the outer block statement is low. So, it is easy to extract this “for-statement” from the outer block statement. In addition, there is no outer variable that is referenced in both this “for-statement” and the upper “for-statement”. That means the horizontal coupling between this “for-statement” and the upper “for-statement” is low. So, the upper “for-statement” is also not included in the extracted part. We think this identification is adequate also from a functional standpoint because of the code comments in the place. if1 2018/11/22

考察 改善案 適用範囲 変数ごとに重要度を定義 1つのコードブロックは1つの機能に対応 ある程度規模の大きなメソッドが対象 重要度の高い変数が協調しているほど高結合 適用範囲 1つのコードブロックは1つの機能に対応 ブロックの構造を壊すようなメソッド抽出には未対応 ある程度規模の大きなメソッドが対象 複数のコードブロック 複数の使用変数 2018/11/22

まとめと今後の課題 まとめ 今後の予定 メソッド抽出リファクタリングを支援する手法を提案 実験の拡大 新規メソッドとして抽出する範囲を自動特定 今後の予定 実験の拡大 実験対象の追加による汎用性の検証 リファクタリングの問題点の解決に関する定量的な評価 問題点のどう解決するかの実験が必要という 2018/11/22

変数を用いた機能の抽象化例 void METHOD() { VAR v1, v2, v3; …………………………… BLOCK1 { } BLOCK3 { v5 = v1 + 4; v5 = v1 + v2 2018/11/22

親子ブロック結合度の算出例 void METHOD() { …………………………… BLOCK1 { VAR v1,v2,v3,v4; } void METHOD() { …………………………… BLOCK1 { VAR v1,v2,v3,v4; newMETHOD(v1,v2); } void newMethod(VAR v1, VAR v2) { BLOCK2 { VAR v5,v6 v5 = v1 + v2; v6 = v1 + v5; 2018/11/22

関連研究 Eclipseのリファクタリング機能 基本ブロックスライシングによるメソッド抽出 Murphy-Hillらの研究 コード修正(リファクタリングプロセス4)の自動化 本手法と組み合わせることが可能 基本ブロックスライシングによるメソッド抽出 変数を1つ指定し,影響範囲をメソッドとして抽出 メソッドの機能は複数の変数を用いた計算により成立 絡み合ったコードを分割することができる Murphy-Hillらの研究 リファクタリングツール作成のガイドライン 軽快なツール 例外的なフォーマットへの対応 特定のタスクに特化した機能 2018/11/22

メソッド抽出リファクタリング メソッドの一部を新しいメソッドとして抽出 普遍的で頻繁に行われるリファクタリングパターン 対象 長すぎるメソッド 複雑な制御構造をもつメソッド 効果 再利用性の向上 適切な命名を行うことで内部の処理の可読性が向上 拡張性の向上 普遍的で頻繁に行われるリファクタリングパターン ⇒自動化の効果が大きい 再利用性の向上 ↓ 重複コード生成の防止 開発コストの削減 可読性のコード メソッドが何をしているのかメソッド名のみでわかる 呼び出し側のメソッドをコメント列のようによめる 2018/11/22