Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


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

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

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

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

4 メソッド抽出の例と特徴 短いメソッドを形成する 他のメソッドから利用しやすい 適切な命名を行うことで、内部の処理の理解が容易になる
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

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

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

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

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

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

10 コードブロック間の関係 兄弟関係 親子関係 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

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

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

13 同一機能に属するコードブロック群識別アルゴリズム
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

14 同一機能に属するブロック文群識別の例(閾値: 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

15 適用事例 対象 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

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

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

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

19 親子ブロック結合度の算出例 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

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

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


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

Similar presentations


Ads by Google