機能的関心事を抽出するためのプログラム

Download Report

Transcript 機能的関心事を抽出するためのプログラム

同一メソッド内に含まれる
ブロック間の結合度を用いた
メソッド分割手法の提案
井上研究室
M2 三宅達也
Department of Computer Science,
Graduate School of Information Science & Technology,
Osaka University
研究概要
 ソフトウェアの設計品質を高く保つことが
重要
⇒ソフトウェアの設計品質を向上させるた
めの技術
 メソッド抽出リファクタリングを支援する手
法の提案
2015/9/30
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
2
メソッド抽出リファクタリング

メソッド内のコードの一部を新規メソッドとして
抽出
 既存の1つのメソッドを2つの短いメソッドに分割

メソッド抽出リファクタリングの手順
 メソッド抽出リファクタリングを必要とするメソッドを
特定
 新規メソッドとして抽出する範囲を識別
 識別範囲をメソッドとして抽出
 プログラムの振る舞いが変わっていないか検証
2015/9/30
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
3
メソッド抽出の例と特徴
public void sample ( ) {
i = 0;
 int
while( hoge() ) {
String str = “string”;
 jar( i ) ) {
if(
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);
}
}
}
2015/9/30
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
4
研究の動機と目的

研究動機
メソッド抽出リファクタリングは
 さまざまな利点を持つ
 頻繁に行われる普遍的な作業
 他の品質向上作業の前準備
⇒自動化の効果が大きい
 研究目的
 メソッド抽出リファクタリングを支援する手法を提案
 新規メソッドとして抽出すべき範囲を自動的に特定
2015/9/30
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
5
適切なメソッド抽出

機能に基づいて分割されたメソッド
 機能:1つのメソッドが実現する特定の処理

引数の少ないメソッド
 呼び出し元のメソッドとの依存関係が小さい
 引数の役割が理解しやすい
⇒ 凝集度の高いメソッド
 メソッドの構成要素が協調
 メソッドが適切に役割分担されている


メソッド内の構成要素が密結合
メソッド内部と外部の要素は疎結合
2015/9/30
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
6
提案手法の概要

新規メソッドとして抽出する範囲を自動的に
識別
 メソッド内のコードが実現する機能を変数集合で
表現
 コードブロック間の結合度を定義
 互いに強く結合しているコードブロック群を識別
新規メソッドとして抽出するコードブロック群
2015/9/30
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
7
変数を用いた機能の表現

メソッドの機能:変数の値を決定するための計
算[23]
 変数を指定することはメソッドの機能を指定すること
と同義
 過去の研究では返り値のみに着目
 提案手法ではメソッド内で使用されている全変数に着目
⇒コード片B の機能を変数集合V(B) で表す
V ( B)  {v1, v2, v3 vn  1, vn}
(vi : B内に出現する変数 )
[23]丸山.基本ブロックスライシングを用いたメソッド抽出リファクタリング.
情報処理学会論文誌43(6):1625-1637, Jun 2002.
2015/9/30
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
8
コード片の協調度合

変数集合の共通要素が要素数の
少ない変数集合を占める割合
共通要素の数
| V ( B1)  V ( B 2) |
Collaboration( B1, B 2) 
Min(| V ( B1) |, | V ( B 2) |)
要素数の少ない変数集合の要素数

V
VV111
{
{{vvv11,,1,vvv222,,,vvv33,,3,vvv444,,,vvv55}
}5}
2  {v 3, v 4, v 5}
VVV22
{{vv3,5,vv46,,vv5,7,vv6}8}
協調度合が高いとき2つのコード片 V
V 

VV
V 

V{
{vv,,{vvv ,,}vv }
}
は同一の機能を実現するためのコ
Collaborat

1
ード片である可能性が高い
Collaborat
Collaborat
ion
ion
(ion
B
( B, (B
,B
B),)B0)0.75
.25
1
1
1
2
2
2
1 1
3
3
4
45
5
5
1
2 2
2
2015/9/30
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
9
コードブロック間の関係
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
if
while
for
兄弟関係
親子関係
if
2015/9/30
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
10
兄弟ブロック結合

兄弟関係にあるコードブロック間の結合度
 兄弟関係にあるコードブロックの機能の協調度合
 B1とB2が兄弟関係にある時
SBC( B1, B 2)  Collaboration( B1, B 2)
| V ( B1)  V ( B 2) |

Min(| V ( B1) |, | V ( B 2) |)

兄弟ブロック結合度が閾値以上
 2つのコードブロックを1つのメソッドとして抽出
2015/9/30
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
11
親子ブロック結合

親子関係にあるコードブロック間の結合度
 子コードブロック Bc
の機能と Bc をメソッド抽出した後
に残る親コードブロック Bp _ after の機能の協調度合
PBC( Bc, Bp )  Collaboration( Bc, Bp _ after )
| V ( Bc )  V ( Bp _ after ) |

Min(| V ( Bc ) |, | V ( Bp _ after ) |)

親子ブロック結合度が閾値以上
 子コードブロックだけでなく親コードブロックごとメ
ソッド抽出
2015/9/30
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
12
同一機能に属するコードブロック群識別アルゴリズム
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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
end if
if ( PBとSCBが親子ブロック結合している )
if ( PBがメソッド全体でない )
B = PB
GOTO 行3
end if
else
SCBを新規メソッドとして抽出
end if
2015/9/30
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
13
同一機能に属するブロック文群識別の例(閾値: 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
2015/9/30
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
14
適用事例
for1
for2

対象


学生の書いたプログラム
If1,for3,for4が同一の機
能を実現するための
コードブロック群



主観的判断
コードコメント
再利用可能な機能的単
位
for3
for4
if1
2015/9/30
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
15
考察

改善案
 変数ごとに重要度を定義
 重要度の高い変数が協調しているほど高結合

適用範囲
 1つのコードブロックは1つの機能に対応
 ブロックの構造を壊すようなメソッド抽出には未対応
 ある程度規模の大きなメソッドが対象
 複数のコードブロック
 複数の使用変数
2015/9/30
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
16
まとめと今後の課題
 まとめ
メソッド抽出リファクタリングを支援する手法
を提案
 新規メソッドとして抽出する範囲を自動特定
 今後の予定
実験の拡大
 実験対象の追加による汎用性の検証
 リファクタリングの問題点の解決に関する定量的な評価
2015/9/30
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
17
変数を用いた機能の抽象化例
void METHOD() { F ( M )  {v1, v2, v3, v4, v5}
VAR v1, v2, v3;
F ( B1)  F ( M )
……………………………
BLOCK1 {
F ( B1)  {v1, v2, v4, v5}
VAR v4,v5;
……………………………
F ( B2)  F ( B1)
BLOCK2 {
v4 = v1 + v2;
F ( B2)  {v1, v2, v4}
}
……………………………
BLOCK3 {
v5 = v1 + 4;
F ( B3)  {v1, v4, v5}
}
v5 = v1 + v2
F ( B3)  F ( B1)
}
……………………………
}
2015/9/30
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
18
親子ブロック結合度の算出例
void
F
( BMETHOD()
1 _ after){  {v1, v2, v3, v4}
……………………………
BLOCK1 {
VAR v1,v2,v3,v4;
……………………………
newMETHOD(v1,v2);
……………………………
}
……………………………
void METHOD() {
F ( B1)  {v1, v2, v3, v4, v5, v6}
……………………………
BLOCK1 {
VAR v1,v2,v3,v4;
……………………………
F ( B2)  F ( B1)
BLOCK2 {
VAR v5,v6
}
v5 = v1 + v2;
v6 = v1 + v5;
void newMethod(VAR v1, VAR v2) {
}
BLOCK2 {
……………………………
F
(
B
2
)

{
v
1
,
v
2
,
v
5
,
v
6
}
VAR v5,v6
}
v5 = v1 + v2;
……………………………
v6 = v1 + v5;
}
}
}
2015/9/30
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
19
関連研究

Eclipseのリファクタリング機能



コード修正(リファクタリングプロセス4)の自動化
本手法と組み合わせることが可能
基本ブロックスライシングによるメソッド抽出

変数を1つ指定し,影響範囲をメソッドとして抽出



メソッドの機能は複数の変数を用いた計算により成立
絡み合ったコードを分割することができる
Murphy-Hillらの研究

リファクタリングツール作成のガイドライン
軽快なツール
 例外的なフォーマットへの対応
 特定のタスクに特化した機能

2015/9/30
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
20
メソッド抽出リファクタリング

メソッドの一部を新しいメソッドとして抽出
 対象


長すぎるメソッド
複雑な制御構造をもつメソッド
 効果




再利用性の向上
適切な命名を行うことで内部の処理の可読性が向上
拡張性の向上
普遍的で頻繁に行われるリファクタリングパターン
⇒自動化の効果が大きい
2015/9/30
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
21