e Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka Un 差差差差差差差差差差差差差差差差差差差 ○ 差差 差 1 差差 差差 , 2 差差 差差 , 1 差差 差差 , 1 1 差差差差 2 差差差差差差差差差差差差差
Jan 03, 2016
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
差分を含む類似メソッドの集約支援ツール
○ 後藤 祥 1 ,吉田 則裕 2 ,井岡 正和 1 ,井上 克郎 1
1 大阪大学2 奈良先端科学技術大学院大学
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
2
研究概要• 類似メソッドの集約作業を支援する手法を提案
– 抽象構文木を用いて集約候補を検出– 集約候補を凝集度の高い順に並び替えて提示
• 手法を統合開発環境のプラグインとして実装
• オープンソース上の類似メソッドに手法を適用• アンケートによって集約候補を評価
– 有用な集約候補を提示できていることを確認
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
3
類似メソッド
• 互いに一致または類似したメソッド– ソフトウェアの保守性を低下させる要因
・・・ 類似メソッド
同様の欠陥が存在する可能性が高い
欠陥
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
4
類似メソッドの集約• 類似メソッドをまとめて 1 つのメソッドにする
• 類似メソッドに差分が存在する場合– 差分をメソッドとして抽出して,類似メソッドを完全
一致させる
集約
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
5
類似メソッド集約手順 (1/3)
public void similarMethodA(){
if(finalBuffer.remaining() < 8){ while(finalBuffer.remaining() > 0){ finalBuffer.put((byte)0); } finalBuffer.position(0); transform(finalBuffer); finalBuffer.position(0); } finalBuffer.putLong(length << 3); finalBuffer.position(0); transform(finalBuffer);
}
public void similarMethodB(){
if(finalBuffer.remaining() < 8){ while(finalBuffer.remaining() > 0){ finalBuffer.put((byte)0); } finalBuffer.position(0); transform(finalBuffer.array(),0); finalBuffer.position(0); } finalBuffer.putLong(length << 3); finalBuffer.position(0); transform(finalBuffer.array(),0);
}
• 類似メソッド間の差分を特定する
・・・
・・・
・・・
・・・
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
6
public void similarMethodB(){
if(finalBuffer.remaining() < 8){ while(finalBuffer.remaining() > 0){ finalBuffer.put((byte)0); } finalBuffer.position(0); transform(finalBuffer.array(),0); finalBuffer.position(0); } finalBuffer.putLong(length << 3); finalBuffer.position(0); transform(finalBuffer.array(),0);
}
public void similarMethodA(){
if(finalBuffer.remaining() < 8){ while(finalBuffer.remaining() > 0){ finalBuffer.put((byte)0); } finalBuffer.position(0); transform(finalBuffer); finalBuffer.position(0); } finalBuffer.putLong(length << 3); finalBuffer.position(0); transform(finalBuffer);
}
類似メソッド集約手順 (2/3)
• メソッドとして抽出するコード片の集合を決定する
・・・
・・・
・・・
・・・
条件 1: 全てのコード片はメソッド抽出可能である
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
7
類似メソッド集約手順 (2/3)
• メソッドとして抽出するコード片の集合を決定する public void similarMethodB(){
if(finalBuffer.remaining() < 8){ while(finalBuffer.remaining() > 0){ finalBuffer.put((byte)0); } finalBuffer.position(0); transform(finalBuffer.array(),0); finalBuffer.position(0); } finalBuffer.putLong(length << 3); finalBuffer.position(0); transform(finalBuffer.array(),0);
}
public void similarMethodA(){
if(finalBuffer.remaining() < 8){ while(finalBuffer.remaining() > 0){ finalBuffer.put((byte)0); } finalBuffer.position(0); transform(finalBuffer); finalBuffer.position(0); } finalBuffer.putLong(length << 3); finalBuffer.position(0); transform(finalBuffer);
}
・・・
・・・
・・・
・・・
条件 2: 同じメソッド内の各コード片は重複部分がない
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
8
類似メソッド集約手順 (2/3)
• メソッドとして抽出するコード片の集合を決定する public void similarMethodB(){
if(finalBuffer.remaining() < 8){ while(finalBuffer.remaining() > 0){ finalBuffer.put((byte)0); } finalBuffer.position(0); transform(finalBuffer.array(),0); finalBuffer.position(0); } finalBuffer.putLong(length << 3); finalBuffer.position(0); transform(finalBuffer.array(),0);
}
public void similarMethodA(){
if(finalBuffer.remaining() < 8){ while(finalBuffer.remaining() > 0){ finalBuffer.put((byte)0); } finalBuffer.position(0); transform(finalBuffer); finalBuffer.position(0); } finalBuffer.putLong(length << 3); finalBuffer.position(0); transform(finalBuffer);
}
・・・
・・・
・・・
・・・
条件 3: 各差分はいずれかのコード片に含まれる
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
9
類似メソッド集約手順 (2/3)
• メソッドとして抽出するコード片の集合を決定する public void similarMethodB(){
if(finalBuffer.remaining() < 8){ while(finalBuffer.remaining() > 0){ finalBuffer.put((byte)0); } finalBuffer.position(0); transform(finalBuffer.array(),0); finalBuffer.position(0); } finalBuffer.putLong(length << 3); finalBuffer.position(0); transform(finalBuffer.array(),0);
}
public void similarMethodA(){
if(finalBuffer.remaining() < 8){ while(finalBuffer.remaining() > 0){ finalBuffer.put((byte)0); } finalBuffer.position(0); transform(finalBuffer); finalBuffer.position(0); } finalBuffer.putLong(length << 3); finalBuffer.position(0); transform(finalBuffer);
}
・・・
・・・
・・・
・・・
条件 4: 抽出後に類似メソッドが完全に一致する
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
10
類似メソッド集約手順 (3/3)
• 各コード片をメソッドとして抽出するpublic void similarMethodB(){
if(finalBuffer.remaining() < 8){ while(finalBuffer.remaining() > 0){ finalBuffer.put((byte)0); }
methodA(); } methodB();
}
public void similarMethodA(){
if(finalBuffer.remaining() < 8){ while(finalBuffer.remaining() > 0){ finalBuffer.put((byte)0); }
methodA(); } methodB();
}
・・・
・・・
・・・
・・・
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
11
集約作業における問題点
問題点 1 : 条件を満たすコード片の集合を,どのように探すか
問題点 2 : 条件を満たすコード片の集合のうち,どれを選択するか
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
12
提案手法
• 集約候補を提示することで集約作業を支援– 集約候補:メソッドとして抽出するコード片の集合– 条件を満たすコード片の集合を提示する
• 凝集度を用いて集約候補の並び替えを行う– 凝集度の高いメソッドは保守性や可読性に優れてい
る– 凝集度の高い集約候補を先に提示する
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
13
集約候補の例
13
public void similarMethodB(){
if(finalBuffer.remaining() < 8){ while(finalBuffer.remaining() > 0){ finalBuffer.put((byte)0); } finalBuffer.position(0); transform(finalBuffer.array(),0); finalBuffer.position(0); } finalBuffer.putLong(length << 3); finalBuffer.position(0); transform(finalBuffer.array(),0);
}
public void similarMethodA(){
if(finalBuffer.remaining() < 8){ while(finalBuffer.remaining() > 0){ finalBuffer.put((byte)0); } finalBuffer.position(0); transform(finalBuffer); finalBuffer.position(0); } finalBuffer.putLong(length << 3); finalBuffer.position(0); transform(finalBuffer);
}
・・・
・・・
・・・
・・・
• メソッドとして抽出するコード片の集合
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
14
提案手法の概要
1. 類似メソッド間の差分を特定する差分を含む類似メソッド
開発者
2. 集約候補を検出する
3 . 凝集度を用いて集約候補を並び替える
類似メソッド対の集約候補
順位づけされた集約候補一覧
提案するツール
差分となっているコード片の集合
・・・
入力
出力
1 2 3
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
15
1 .類似メソッド間の差分の特定
1-1 抽象構文木の比較
1-2 差分を含む文の特定
1-3 差分の統合
1. 類似メソッド間の差分を特定する
差分を含む類似メソッド
差分となっているコード片の集合
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
16
抽象構文木 (AST)
• 各ノードはラベルを持つ ( タイプや値を表す )• AST における特殊ノードを定義する
– ソースコード中で 1 つの文を表すノード
int max(int a, int b){ int max = a; if(b > max) max = b; return max;}
VariableDeclarationStatement
max a=
IfStatement
ExpressionStatement
ReturnStatement
b max> max b=
maxint
MethodDeclaration
InfixExpression
特殊ノード
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
17
1-1 AST の比較• 根ノードから葉に向かって再帰的に比較• ノードのラベルを比較して異なっていれば差分
とする
比較ExpressionStatement
a b=
Block
ExpressionStatement
b c=
差分となっているノード
ExpressionStatement
a b=
Block
ExpressionStatement
b d=
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
18
1-2 差分を含む文の特定• AST 上の差分であるノードから親ノードへ辿っ
ていく• 最初に到達した特殊ノードを根とする部分木が
差分となっている文に対応している
ExpressionStatement
a b=
Block
ExpressionStatement
b c=
ExpressionStatement
a b=
Block
ExpressionStatement
b d=
a = b;
b = c;
a = b;
b = d;
・・・
・・・
・・・
・・・
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
19
1-3 差分の統合• これまでの操作で差分となっている文が検出さ
れる
• 隣接している差分の統合を行う– 最終的に検出される差分の数を減らすため
1 .隣接している差分の統合2 .中括弧で囲まれたブロック内の差分の統合
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
20
2 .集約候補の検出
2-1 メソッド抽出可能なコード片の検出
2-2 集約候補の検出
2-3 集約候補のフィルタリング
2 .集約候補の検出
集約候補一覧
差分となっているコード片の集合
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
21
2-1 メソッド抽出可能なコード片の検出
• 差分を含み抽出可能なコード片を全て検出する– コード片の拡大とメソッド抽出可能であるかの判定を繰り
返し行う
if(finalBuffer.remaining() < 8) {
while(finalBuffer.remaining() > 0) {
finalBuffer.put((byte)0);
}
finalBuffer.position(0);
transform(finalBuffer);
finalBuffer.position(0);
}
拡大
メソッド抽出可能か判定
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
22
if(finalBuffer.remaining() < 8) {
while(finalBuffer.remaining() > 0) {
finalBuffer.put((byte)0);
}
finalBuffer.position(0);
transform(finalBuffer);
finalBuffer.position(0);
}
finalBuffer.putLong(length << 3);
finalBuffer.position(0);
transform(finalBuffer);
2-2 集約候補の検出
差分 δ1 を含みメソッド抽出可能なコード片の集合
差分 δ2 を含みメソッド抽出可能なコード片の集合
条件を満たすようにコード片を選択する
差分 δ2
差分 δ1
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
23
2-3 集約候補のフィルタリング• 広い範囲をメソッドとして抽出する集約候補は除
外– 抽出後のメソッドが再び類似メソッドとなる
if(finalBuffer.remaining() < 8) {
while(finalBuffer.remaining() > 0) {
finalBuffer.put((byte)0);
}
finalBuffer.position(0);
transform(finalBuffer);
finalBuffer.position(0);
}
finalBuffer.putLong(length << 3);
finalBuffer.position(0);
transform(finalBuffer);
if(finalBuffer.remaining() < 8) {
while(finalBuffer.remaining() > 0) {
finalBuffer.put((byte)0);
}
finalBuffer.position(0);
transform(finalBuffer.array(),0);
finalBuffer.position(0);
}
finalBuffer.putLong(length << 3);
finalBuffer.position(0);
transform(finalBuffer.array(),0);
抽出範囲が広すぎる
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
24
3. 集約候補の並び替え• 開発者は提示された候補の中から 1 つを選択する
– 集約候補の数が多い場合,選択する作業が困難になる
• 凝集度が高い集約候補から順番に提示する– 凝集度の高いメソッドは保守性や可読性に優れている
・・・
1 2 43
凝集度が高い良い候補
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
25
凝集度メトリクス
[1] Weiser, M.: Program slicing, Proc. of ICSE1981, pp.439–449 (1981)
• プログラムスライスを用いた凝集度メトリクス [1]– メソッドの返り値に着目して凝集度を計測
• 提案手法ではメソッドの引数も使用する– 返り値が存在しないメソッドの凝集度を計算するため
• 3種類のメトリクスを使用– FTightness, FCoverage, FOverlap– それぞれ独立に使用して 3 つのランキングを生成す
る
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
26
全スライスの積集合 )(3
1
M
SL
M
SL
M
SL resultba )(
3
1 intintint
resultba SL
SL
SL
SL
SL
SL
積集合に含まれる文の数
各スライスに含まれる文の数
凝集度の計算例
int permutation(int a, int b) { int i; int result = 1; for (i = 0; i < b; i++) { result = result * a; a = a – 1; } return result;}
123456789
||
|
SLa
|||
|
SLb
|||||
|
SLresult
||
|
SLint
引数 a,b を起点とした
前向きスライス
返り値 result を起点とした
後ろ向きスライス
FTightness = 0.500
FCoverage = 0.722
FOverlap = 0.750
積集合に含まれる文の数
メソッドの文の数
各スライスに含まれる文の数
メソッドの文の数 M
SL int
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
27
実装• 提案手法を Eclipse プラグインとして実装
集約候補の選択タブ ( 番号は検出順 )
メトリクスの選択集約候補中のコード
片
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
28
適用実験
• オープンソース上の類似メソッドに手法を適用
• 出力結果に対して評価アンケートを実施– 被験者が良いと思う候補を提示できているか– 被験者は学生 15名 ( ソフトウェア工学関連の研究室に所属 )
• アンケート内容– 出力された候補のうち,上位 10 候補を被験者へ提示– 提示された候補のうち良いと思う候補を選択 ( 複数
可 )
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
29
実験対象• Ant プロジェクト executeDrawOperation メ
ソッド– Arc クラス , Ellipse クラス
• ANTLR プロジェクト genErrorHandler メソッド– CppCodeGenerator クラス , JavaCodeGenerator クラス
• フィルタリングの閾値を 0.5 に設定して手法を適用– Ant : 14 個の集約候補を検出 ( フィルタリング前は 23個 )
– ANTLR : 6 個の集約候補を検出 ( フィルタリング前は34個 )
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
30
評価尺度 (1/2)
• 平均候補選択率– 全体のうち被験者に選択された集約候補の割合– 被験者にとって有用な集約候補がどれだけ存在するか
平均候補選択率 = 提示した全候補数
選択された候補数
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
31
評価尺度 (2/2)
• 平均適合率– 検索エンジンなどのランキングを評価する尺度 [2]– 被験者に選択された集約候補が上位に提示されていた
か
平均適合率 =
A
i
iAPA 0
)(1
:正解集合
: 中の 番目の要素がランキングに現れた時の適合率
A)( iAP A i
[2] Baeza-Yates, R. et al. : Modern Information Retrieval, Addison Wesley, second edition,2011.
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
32
平均適合率の計算例
順位 候補 選択
1 A
2 B ○
3 C ○
4 D
5 E
6 F
7 G ○
8 H
9 I
10 J
全体の候補数: 2選択された候補数: 1適合率 = 0.5
全体の候補数: 3選択された候補数: 2適合率 = 0.667
全体の候補数: 7選択された候補数: 3適合率 = 0.429
平均適合率 = 0.532
平均値を計算
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
33
平均適合率の結果はAnt で約 0.5 , ANTLR で約 0.4
全体の 2割程度が被験者に選択されている
結果 (1/2)
メトリクス 平均候補選択率 平均適合率
Ant
FTightness 0.253 0.533
FCoverage 0.213 0.560
FOverlap 0.253 0.535
ANTLR
FTightness 0.267 0.438
FCoverage 0.267 0.346
FOverlap 0.267 0.438
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
34
結果 (2/2)
• Ant に対する FTightness の結果1 位 2 位 3 位 4 位 5 位 6 位 7 位 8 位 9 位 10 位
被験者 A ○ ○ ○ ○ ○ ○ ○ 被験者 B 被験者 C ○ ○ ○ 被験者 D ○ ○ 被験者 E ○ ○ 被験者 F ○ ○ 被験者 G ○ 被験者 H ○ ○ 被験者 I ○ 被験者 J ○ ○ 被験者 K ○ ○ ○ ○ 被験者 L ○ ○ ○ 被験者 M ○ ○ ○ 被験者 N ○ ○ 被験者 O ○ ○ ○ ○
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
35
まとめ
• 類似メソッドの集約作業を支援する手法を提案– AST を用いた集約候補の検出– 凝集度を用いた集約候補の並び替え
• 実際の類似メソッドへの適用・アンケート評価– 提示した候補のうち, 2割程度が有用な候補であった
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
36
今後の課題
• 多数の類似メソッドを対象とした適用実験
• ツールへの機能追加– 3 つ以上の類似メソッドへの適用– 集約候補の検索機能
• ツールを使用した評価– 集約作業の支援にどの程度有効であるか