同一メソッド内に含まれる ブロック間の結合度を用いた...

21
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 同同同同同同同同同同 同同同同同同同同同同同同同 同同同同同同同同同同同 井井井井井 M 井井井井

Upload: tammy

Post on 20-Jan-2016

30 views

Category:

Documents


2 download

DESCRIPTION

同一メソッド内に含まれる ブロック間の結合度を用いた メソッド分割手法の提案. 井上研究室 M 2 三宅達也. 研究概要. ソフトウェアの設計品質を高く保つことが重要  ⇒ソフトウェアの設計品質を向上させるための技術 メソッド抽出リファクタリングを支援する手法の提案. メソッド抽出リファクタリング. メソッド内のコードの一部を新規メソッドとして抽出 既存の1つのメソッドを2つの短いメソッドに分割 メソッド抽出リファクタリングの手順 メソッド抽出リファクタリングを必要とするメソッドを特定 新規メソッドとして抽出する範囲を識別 識別範囲をメソッドとして抽出 - PowerPoint PPT Presentation

TRANSCRIPT

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

Department of Computer Science, Graduate School of Information Science & Technology,Osaka University

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

井上研究室M 2 三宅達也

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

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 2

研究概要

ソフトウェアの設計品質を高く保つことが重要

 ⇒ソフトウェアの設計品質を向上させるための技術

メソッド抽出リファクタリングを支援する手法の提案

23/04/21

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

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

メソッド抽出リファクタリング

メソッド内のコードの一部を新規メソッドとして抽出既存の1つのメソッドを2つの短いメソッドに分

割 メソッド抽出リファクタリングの手順

メソッド抽出リファクタリングを必要とするメソッドを特定

新規メソッドとして抽出する範囲を識別識別範囲をメソッドとして抽出プログラムの振る舞いが変わっていないか検証

3

23/04/21

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

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

メソッド抽出の例と特徴

23/04/21

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); } }}

抽出

短いメソッドを形成する 他のメソッドから利用しや

すい 再利用性の向上 重複コードの生成防止

適切な命名を行うことで、内部の処理の理解が容易になる

可読性の向上 オーバライドが行いやすい

拡張性の向上

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

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 5

研究の動機と目的 研究動機 メソッド抽出リファクタリングは

さまざまな利点を持つ頻繁に行われる普遍的な作業

他の品質向上作業の前準備

  ⇒自動化の効果が大きい  研究目的

メソッド抽出リファクタリングを支援する手法を提案新規メソッドとして抽出すべき範囲を自動的に特定

23/04/21

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

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

適切なメソッド抽出

機能に基づいて分割されたメソッド 機能:1つのメソッドが実現する特定の処理

引数の少ないメソッド 呼び出し元のメソッドとの依存関係が小さい 引数の役割が理解しやすい

⇒  凝集度の高いメソッド メソッドの構成要素が協調 メソッドが適切に役割分担されている

メソッド内の構成要素が密結合 メソッド内部と外部の要素は疎結合

6

23/04/21

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

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

提案手法の概要

新規メソッドとして抽出する範囲を自動的に識別メソッド内のコードが実現する機能を変数

集合で表現コードブロック間の結合度を定義互いに強く結合しているコードブロック群

を識別

7

23/04/21

新規メソッドとして抽出するコードブロック群

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

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

変数を用いた機能の表現

メソッドの機能:変数の値を決定するための計算 [23]変数を指定することはメソッドの機能を指定す

ることと同義過去の研究では返り値のみに着目提案手法ではメソッド内で使用されている全変数に

着目

⇒ コード片B の機能を変数集合 V( B ) で表す

8

):(},,,{)( 1321

内に出現する変数 Bvi

nn vvvvvBV

[23] 丸山 . 基本ブロックスライシングを用いたメソッド抽出リファクタリング .情報処理学会論文誌 43(6):1625-1637, Jun 2002.

23/04/21

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

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

コード片の協調度合

変数集合の共通要素が要素数の少ない変数集合を占める割合

協調度合が高いとき2つのコード片は同一の機能を実現するためのコード片である可能性が高い

9

|))(||,)((|

|)()(|),(

21

21

21

BVBVMin

BVBVBBionCollaborat

},,,,{ 543211 vvvvvV

},,,{ 87652 vvvvV

}{ 521 vVV

25.0),( 21 BBionCollaborat

},,,,{ 543211 vvvvvV

},,,{ 65432 vvvvV

},,{ 54321 vvvVV

75.0),( 21 BBionCollaborat

},,,,{ 543211 vvvvvV

},,{ 5432 vvvV

},,{ 54321 vvvVV

1),( 21 BBionCollaborat

共通要素の数

要素数の少ない変数集合の要素数

23/04/21

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

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 10

コードブロック間の関係

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); make(str); }}

sample ( )

while while

if for

if

親子関係兄弟関係

23/04/21

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

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

兄弟ブロック結合

兄弟関係にあるコードブロック間の結合度兄弟関係にあるコードブロックの機能の協調度合

B1 と B2 が兄弟関係にある時

兄弟ブロック結合度が閾値以上2つのコードブロックを1つのメソッドとして

抽出

|))(||,)((|

|)()(|),(),(

21

21

2121

BVBVMin

BVBVBBionCollaboratBBSBC

         

11

23/04/21

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

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 12

親子ブロック結合

親子関係にあるコードブロック間の結合度子コードブロック  の機能と  をメソッド抽

出した後に残る親コードブロック   の機能の協調度合

親子ブロック結合度が閾値以上子コードブロックだけでなく親コードブロック

ごとメソッド抽出

cB cBafterpB _

|))(||,)((|

|)()(|),(),(

_

_

_

afterpc

afterpc

afterpcpc

BVBVMin

BVBVBBionCollaboratBBPBC

         

23/04/21

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

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

同一機能に属するコードブロック群識別アルゴリズム

13

1. RESULT = NULL2. B = 特定されたコードブロック3. SCB = B と結合しているコードブロック群 (B を含む )4. NSCB = B と兄弟ブロック結合していないコードブ

ロック群5. PB = B の親コードブロック文6. if ( NSCB が空でない )7. if ( PBC( PB, SCB ) > PBC( PB, NSCB ) )8. NSCB を新規メソッドとして抽出9. else10. SCB を新規メソッドとして抽出11. EXIT12. end if13. end if 14. if ( PB と SCB が親子ブロック結合している )15. if ( PB がメソッド全体でない )16. B = PB17. GOTO 行 318. end if19. else20. SCB を新規メソッドとして抽出21. end if

23/04/21

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

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

同一機能に属するブロック文群識別の例(閾値 : 0.5)

14

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; } }}

23/04/21

SBC: 0.75PBC: 0.66

SBC: 0.25

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

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

適用事例

15

対象 学生の書いたプログラ

If1,for3,for4が同一の機能を実現するためのコードブロック群 主観的判断 コードコメント 再利用可能な機能的単位

for1

for2

for3

for4

if1

23/04/21

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

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

考察

改善案変数ごとに重要度を定義

重要度の高い変数が協調しているほど高結合

適用範囲1つのコードブロックは1つの機能に対応

ブロックの構造を壊すようなメソッド抽出には未対応ある程度規模の大きなメソッドが対象

複数のコードブロック複数の使用変数

23/04/21

16

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

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 17

まとめと今後の課題

まとめメソッド抽出リファクタリングを支援する手

法を提案新規メソッドとして抽出する範囲を自動特定

今後の予定実験の拡大

実験対象の追加による汎用性の検証リファクタリングの問題点の解決に関する定量的な評価

23/04/21

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

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

void METHOD() { VAR v1, v2, v3; …………………………… BLOCK1 { VAR v4,v5; …………………………… BLOCK2 { v4 = v1 + v2; } …………………………… BLOCK3 { v5 = v1 + 4; } v5 = v1 + v2 } ……………………………}

}5,4,2,1{)1( vvvvBF

}5,4,1{)3( vvvBF

}4,2,1{)2( vvvBF

変数を用いた機能の抽象化例

}5,4,3,2,1{)( vvvvvMF )()1( MFBF

)1()2( BFBF

)1()3( BFBF

18

23/04/21

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

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

void METHOD() { …………………………… BLOCK1 { VAR v1,v2,v3,v4; …………………………… BLOCK2 { VAR v5,v6 v5 = v1 + v2; v6 = v1 + v5; } …………………………… } ……………………………}

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

)1()2( BFBF

}6,5,2,1{)2( vvvvBF

}6,5,4,3,2,1{)1( vvvvvvBF

}4,3,2,1{)_1( vvvvafterBF

19

23/04/21

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

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

関連研究

Eclipse のリファクタリング機能 コード修正(リファクタリングプロセス 4 )の自動化 本手法と組み合わせることが可能

基本ブロックスライシングによるメソッド抽出 変数を1つ指定し,影響範囲をメソッドとして抽出

メソッドの機能は複数の変数を用いた計算により成立 絡み合ったコードを分割することができる

Murphy-Hill らの研究 リファクタリングツール作成のガイドライン

軽快なツール 例外的なフォーマットへの対応 特定のタスクに特化した機能

20

23/04/21

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

Department of Computer Science, Graduate School of Information Science & Technology, Osaka University

メソッド抽出リファクタリング

メソッドの一部を新しいメソッドとして抽出 対象

長すぎるメソッド 複雑な制御構造をもつメソッド

効果 再利用性の向上 適切な命名を行うことで内部の処理の可読性が向上 拡張性の向上

普遍的で頻繁に行われるリファクタリングパターン

⇒ 自動化の効果が大きい21

23/04/21