Top Banner
e Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka Un 差差差差差差差差差差差差差差差差差差差 ○ 差差 差 1 差差 差差 2 差差 差差 1 差差 差差 1 1 差差差差 2 差差差差差差差差差差差差差
36

差分を含む類似メソッドの集約支援ツール

Jan 03, 2016

Download

Documents

Linda Brady

差分を含む類似メソッドの集約支援ツール. ○ 後藤 祥 1 , 吉田 則裕 2 , 井岡 正和 1 , 井上 克郎 1 1 大阪大学 2 奈良先端科学技術大学院大学. 研究概要. 類似メソッドの集約作業を支援する手法を提案 抽象構文木を用いて集約候補を検出 集約候補を凝集度の高い順に並び替えて提示 手法を統合開発環境のプラグインとして実装 オープンソース上の類似メソッドに手法を適用 アンケートによって集約候補を評価 有用 な集約候補を提示できていることを確認. 類似メソッド. 互いに一致または 類似したメソッド ソフトウェア の保守性を低下 させる要因. - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 差分を含む類似メソッドの集約支援ツール

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

差分を含む類似メソッドの集約支援ツール

○ 後藤 祥 1 ,吉田 則裕 2 ,井岡 正和 1 ,井上 克郎 1

1 大阪大学2 奈良先端科学技術大学院大学

Page 2: 差分を含む類似メソッドの集約支援ツール

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

2

研究概要• 類似メソッドの集約作業を支援する手法を提案

– 抽象構文木を用いて集約候補を検出– 集約候補を凝集度の高い順に並び替えて提示

• 手法を統合開発環境のプラグインとして実装

• オープンソース上の類似メソッドに手法を適用• アンケートによって集約候補を評価

– 有用な集約候補を提示できていることを確認

Page 3: 差分を含む類似メソッドの集約支援ツール

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

3

類似メソッド

• 互いに一致または類似したメソッド– ソフトウェアの保守性を低下させる要因

・・・ 類似メソッド

同様の欠陥が存在する可能性が高い

欠陥

Page 4: 差分を含む類似メソッドの集約支援ツール

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

4

類似メソッドの集約• 類似メソッドをまとめて 1 つのメソッドにする

• 類似メソッドに差分が存在する場合– 差分をメソッドとして抽出して,類似メソッドを完全

一致させる

集約

Page 5: 差分を含む類似メソッドの集約支援ツール

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

}

• 類似メソッド間の差分を特定する

・・・

・・・

・・・

・・・

Page 6: 差分を含む類似メソッドの集約支援ツール

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: 全てのコード片はメソッド抽出可能である

Page 7: 差分を含む類似メソッドの集約支援ツール

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: 同じメソッド内の各コード片は重複部分がない

Page 8: 差分を含む類似メソッドの集約支援ツール

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: 各差分はいずれかのコード片に含まれる

Page 9: 差分を含む類似メソッドの集約支援ツール

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: 抽出後に類似メソッドが完全に一致する

Page 10: 差分を含む類似メソッドの集約支援ツール

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

}

・・・

・・・

・・・

・・・

Page 11: 差分を含む類似メソッドの集約支援ツール

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

11

集約作業における問題点

問題点 1 : 条件を満たすコード片の集合を,どのように探すか

問題点 2 : 条件を満たすコード片の集合のうち,どれを選択するか

Page 12: 差分を含む類似メソッドの集約支援ツール

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

12

提案手法

• 集約候補を提示することで集約作業を支援– 集約候補:メソッドとして抽出するコード片の集合– 条件を満たすコード片の集合を提示する

• 凝集度を用いて集約候補の並び替えを行う– 凝集度の高いメソッドは保守性や可読性に優れてい

る– 凝集度の高い集約候補を先に提示する

Page 13: 差分を含む類似メソッドの集約支援ツール

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

}

・・・

・・・

・・・

・・・

• メソッドとして抽出するコード片の集合

Page 14: 差分を含む類似メソッドの集約支援ツール

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

14

提案手法の概要

1. 類似メソッド間の差分を特定する差分を含む類似メソッド

開発者

2. 集約候補を検出する

3 . 凝集度を用いて集約候補を並び替える

類似メソッド対の集約候補

順位づけされた集約候補一覧

提案するツール

差分となっているコード片の集合

・・・

入力

出力

1 2 3

Page 15: 差分を含む類似メソッドの集約支援ツール

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

15

1 .類似メソッド間の差分の特定

1-1  抽象構文木の比較

1-2  差分を含む文の特定

1-3  差分の統合

1. 類似メソッド間の差分を特定する

差分を含む類似メソッド

差分となっているコード片の集合

Page 16: 差分を含む類似メソッドの集約支援ツール

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

特殊ノード

Page 17: 差分を含む類似メソッドの集約支援ツール

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=

Page 18: 差分を含む類似メソッドの集約支援ツール

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;

・・・

・・・

・・・

・・・

Page 19: 差分を含む類似メソッドの集約支援ツール

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

19

1-3 差分の統合• これまでの操作で差分となっている文が検出さ

れる

• 隣接している差分の統合を行う– 最終的に検出される差分の数を減らすため

1 .隣接している差分の統合2 .中括弧で囲まれたブロック内の差分の統合

Page 20: 差分を含む類似メソッドの集約支援ツール

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

20

2 .集約候補の検出

2-1 メソッド抽出可能なコード片の検出

2-2 集約候補の検出

2-3 集約候補のフィルタリング

2 .集約候補の検出

集約候補一覧

差分となっているコード片の集合

Page 21: 差分を含む類似メソッドの集約支援ツール

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

}

拡大

メソッド抽出可能か判定

Page 22: 差分を含む類似メソッドの集約支援ツール

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

Page 23: 差分を含む類似メソッドの集約支援ツール

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

抽出範囲が広すぎる

Page 24: 差分を含む類似メソッドの集約支援ツール

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

24

3. 集約候補の並び替え• 開発者は提示された候補の中から 1 つを選択する

– 集約候補の数が多い場合,選択する作業が困難になる

• 凝集度が高い集約候補から順番に提示する– 凝集度の高いメソッドは保守性や可読性に優れている

・・・

1 2 43

凝集度が高い良い候補

Page 25: 差分を含む類似メソッドの集約支援ツール

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 つのランキングを生成す

Page 26: 差分を含む類似メソッドの集約支援ツール

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

Page 27: 差分を含む類似メソッドの集約支援ツール

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

27

実装• 提案手法を Eclipse プラグインとして実装

集約候補の選択タブ ( 番号は検出順 )

メトリクスの選択集約候補中のコード

Page 28: 差分を含む類似メソッドの集約支援ツール

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

28

適用実験

• オープンソース上の類似メソッドに手法を適用

• 出力結果に対して評価アンケートを実施– 被験者が良いと思う候補を提示できているか– 被験者は学生 15名 ( ソフトウェア工学関連の研究室に所属 )

• アンケート内容– 出力された候補のうち,上位 10 候補を被験者へ提示– 提示された候補のうち良いと思う候補を選択 ( 複数

可 )

Page 29: 差分を含む類似メソッドの集約支援ツール

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個 )

Page 30: 差分を含む類似メソッドの集約支援ツール

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

30

評価尺度 (1/2)

• 平均候補選択率– 全体のうち被験者に選択された集約候補の割合– 被験者にとって有用な集約候補がどれだけ存在するか

平均候補選択率 = 提示した全候補数

選択された候補数

Page 31: 差分を含む類似メソッドの集約支援ツール

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.

Page 32: 差分を含む類似メソッドの集約支援ツール

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

平均値を計算

Page 33: 差分を含む類似メソッドの集約支援ツール

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

Page 34: 差分を含む類似メソッドの集約支援ツール

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   ○ ○       ○ ○    

Page 35: 差分を含む類似メソッドの集約支援ツール

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

35

まとめ

• 類似メソッドの集約作業を支援する手法を提案– AST を用いた集約候補の検出– 凝集度を用いた集約候補の並び替え

• 実際の類似メソッドへの適用・アンケート評価– 提示した候補のうち, 2割程度が有用な候補であった

Page 36: 差分を含む類似メソッドの集約支援ツール

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

36

今後の課題

• 多数の類似メソッドを対象とした適用実験

• ツールへの機能追加– 3 つ以上の類似メソッドへの適用– 集約候補の検索機能

• ツールを使用した評価– 集約作業の支援にどの程度有効であるか