機能的関心事を抽出するためのプログラム
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),)B0)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