同一メソッド内に含まれる ブロック間の結合度を用いた...
DESCRIPTION
同一メソッド内に含まれる ブロック間の結合度を用いた メソッド分割手法の提案. 井上研究室 M 2 三宅達也. 研究概要. ソフトウェアの設計品質を高く保つことが重要 ⇒ソフトウェアの設計品質を向上させるための技術 メソッド抽出リファクタリングを支援する手法の提案. メソッド抽出リファクタリング. メソッド内のコードの一部を新規メソッドとして抽出 既存の1つのメソッドを2つの短いメソッドに分割 メソッド抽出リファクタリングの手順 メソッド抽出リファクタリングを必要とするメソッドを特定 新規メソッドとして抽出する範囲を識別 識別範囲をメソッドとして抽出 - PowerPoint PPT PresentationTRANSCRIPT
Department of Computer Science, Graduate School of Information Science & Technology,Osaka University
同一メソッド内に含まれるブロック間の結合度を用いたメソッド分割手法の提案
井上研究室M 2 三宅達也
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 2
研究概要
ソフトウェアの設計品質を高く保つことが重要
⇒ソフトウェアの設計品質を向上させるための技術
メソッド抽出リファクタリングを支援する手法の提案
23/04/21
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
メソッド抽出リファクタリング
メソッド内のコードの一部を新規メソッドとして抽出既存の1つのメソッドを2つの短いメソッドに分
割 メソッド抽出リファクタリングの手順
メソッド抽出リファクタリングを必要とするメソッドを特定
新規メソッドとして抽出する範囲を識別識別範囲をメソッドとして抽出プログラムの振る舞いが変わっていないか検証
3
23/04/21
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); } }}
抽出
短いメソッドを形成する 他のメソッドから利用しや
すい 再利用性の向上 重複コードの生成防止
適切な命名を行うことで、内部の処理の理解が容易になる
可読性の向上 オーバライドが行いやすい
拡張性の向上
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 5
研究の動機と目的 研究動機 メソッド抽出リファクタリングは
さまざまな利点を持つ頻繁に行われる普遍的な作業
他の品質向上作業の前準備
⇒自動化の効果が大きい 研究目的
メソッド抽出リファクタリングを支援する手法を提案新規メソッドとして抽出すべき範囲を自動的に特定
23/04/21
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
適切なメソッド抽出
機能に基づいて分割されたメソッド 機能:1つのメソッドが実現する特定の処理
引数の少ないメソッド 呼び出し元のメソッドとの依存関係が小さい 引数の役割が理解しやすい
⇒ 凝集度の高いメソッド メソッドの構成要素が協調 メソッドが適切に役割分担されている
メソッド内の構成要素が密結合 メソッド内部と外部の要素は疎結合
6
23/04/21
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
提案手法の概要
新規メソッドとして抽出する範囲を自動的に識別メソッド内のコードが実現する機能を変数
集合で表現コードブロック間の結合度を定義互いに強く結合しているコードブロック群
を識別
7
23/04/21
新規メソッドとして抽出するコードブロック群
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
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
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
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
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 12
親子ブロック結合
親子関係にあるコードブロック間の結合度子コードブロック の機能と をメソッド抽
出した後に残る親コードブロック の機能の協調度合
親子ブロック結合度が閾値以上子コードブロックだけでなく親コードブロック
ごとメソッド抽出
cB cBafterpB _
|))(||,)((|
|)()(|),(),(
_
_
_
afterpc
afterpc
afterpcpc
BVBVMin
BVBVBBionCollaboratBBPBC
23/04/21
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
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
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
適用事例
15
対象 学生の書いたプログラ
ム
If1,for3,for4が同一の機能を実現するためのコードブロック群 主観的判断 コードコメント 再利用可能な機能的単位
for1
for2
for3
for4
if1
23/04/21
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
考察
改善案変数ごとに重要度を定義
重要度の高い変数が協調しているほど高結合
適用範囲1つのコードブロックは1つの機能に対応
ブロックの構造を壊すようなメソッド抽出には未対応ある程度規模の大きなメソッドが対象
複数のコードブロック複数の使用変数
23/04/21
16
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University 17
まとめと今後の課題
まとめメソッド抽出リファクタリングを支援する手
法を提案新規メソッドとして抽出する範囲を自動特定
今後の予定実験の拡大
実験対象の追加による汎用性の検証リファクタリングの問題点の解決に関する定量的な評価
23/04/21
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
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
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
関連研究
Eclipse のリファクタリング機能 コード修正(リファクタリングプロセス 4 )の自動化 本手法と組み合わせることが可能
基本ブロックスライシングによるメソッド抽出 変数を1つ指定し,影響範囲をメソッドとして抽出
メソッドの機能は複数の変数を用いた計算により成立 絡み合ったコードを分割することができる
Murphy-Hill らの研究 リファクタリングツール作成のガイドライン
軽快なツール 例外的なフォーマットへの対応 特定のタスクに特化した機能
20
23/04/21
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
メソッド抽出リファクタリング
メソッドの一部を新しいメソッドとして抽出 対象
長すぎるメソッド 複雑な制御構造をもつメソッド
効果 再利用性の向上 適切な命名を行うことで内部の処理の可読性が向上 拡張性の向上
普遍的で頻繁に行われるリファクタリングパターン
⇒ 自動化の効果が大きい21
23/04/21