slide - Software Engineering Laboratory

Download Report

Transcript slide - Software Engineering Laboratory

メソッド抽出リファクタリングが
行われるメソッドの特徴調査
○ 後藤 祥1,吉田 則裕2 ,藤原 賢二2
崔 恩瀞1 ,井上 克郎1
1大阪大学
2奈良先端科学技術大学院大学
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
研究概要
• メソッド抽出が行われるメソッドの特徴を調査
– オープンソースソフトウェアからメソッド抽出の履歴
を収集
– 開発者がどのようなメソッドを対象としているか
• 一般的なメソッドの特徴と比較
– メソッドのサイズ,凝集度に有意な差が存在した
1
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
リファクタリング
• プログラムの外的振る舞いを変化させずに,
内部構造を整理すること [1]
– 様々な種類のリファクタリングが存在する
• 保守性や可読性の向上を目的として行う
[1] M. Fowler, “Refactoring : Improving the Design of Existing Code”, 1999.
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
2
メソッド抽出リファクタリング
• メソッドの一部を新たなメソッドとして抽出するリ
ファクタリング
• 主な用途
– 長いメソッドを短いメソッドに分割する
– 複数の機能を持つメソッドを機能単位に分割する
3
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
メソッド抽出の例(1/2)
• 1-10までの成績を並び替えて表示するプログラム
int[] score = {9,4,8,2,3,10,7,1,6,5};
for(int i=0;i<score.length-1;i++){
for(int j=0;j<score.length-i-1;j++){
if(score[j] < score[j+1]){
int t = score[j];
score[j] = score[j+1];
score[j+1] = t;
}
}
}
for(int i=0;i<score.length;i++){
System.out.println(score[i]);
}
データの入力
ソート
データの出力
4
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
メソッド抽出の例(2/2)
• 1-10までの成績を並び替えて表示するプログラム
ソート部分をメソッド抽出
int[] score = {9,4,8,2,3,10,7,1,6,5};
sort(score);
for(int i=0;i<score.length;i++){
System.out.println(score[i]);
}
public void sort(int[] score){
for(int i=0;i<score.length-1;i++){
for(int j=0;j<score.length-i-1;j++){
if(score[j] < score[j+1]){
int t = score[j];
score[j] = score[j+1];
score[j+1] = t;
}
}
}
}
ソート部分がsortメソッドに置き換わり,
プログラムの可読性が向上した.
機能単位に分割されたことで,バグ修
正などの保守作業が容易になった.
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
5
リファクタリング支援の研究
• 開発履歴の調査と支援手法の提案
1
開発履歴の調査
開発履歴
開発者
2
調査結果に基づく
支援手法・ツールの提案
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
研究者
6
既存の調査研究
• 既存の調査の内容 [2]
– どの種類のリファクタリングが行われているか?
– 開発者がどのようにツールを使っているか?
• コードの特徴の定量的調査は行われていない
– コードの特徴 ・・・ 行数,複雑度など
– リファクタリングされるコードの特徴を調べることで,
リファクタリング対象の推薦ができる
[2] E. Murphy-Hill et al., “How We Refactor, and How We Know It”, 2012
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
7
研究概要
• メソッド抽出リファクタリングの定量的調査
– メソッド抽出されたメソッドと一般的なメソッドの特
徴を比較する
• 調査する特徴:長さ,凝集度
– 凝集度 ・・・ 機能的なまとまりを表す度合
– 抽出の対象となるのは長いメソッドや機能単位で
まとまっていないメソッドと言われている [1]
[1] M. Fowler, “Refactoring : Improving the Design of Existing Code”, 1999.
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
8
調査手順
• メソッド抽出されたメソッドとリリースバージョン
の全メソッドを比較
開発履歴
Extracted
リファクタリング
検出ツール
メソッド抽出事例
抽出対象となった
メソッドの特徴
All
最新の
リリースバージョン
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
全メソッドの特徴
9
メソッド抽出事例の検出
• 本研究では藤原らのツールを使用
メリット
藤原らの
ツール[3]
・複数リビジョンから
一度に検出が可能
・高速・高精度
Ref-Finder[4] ・複数の種類のリファ
UMLDiff[5]
クタリングを検出可能
デメリット
・対象はメソッド抽出
リファクタリングのみ
・一度に検出ができる
のは2リビジョン間のみ
[3] 藤原ら, “構文情報を付加したリポジトリによるメソッド抽出リファクタリングの検出”, 2013.
[4] K. prete et al., “Template-based Reconstruction of Complex Refactorings”, 2010.
[5] Z. Xing et al., “Refactoring Detection based on UMLDiff Change-Facts Queries”, 2006.
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
10
藤原らのツールの検出手順
リビジョン N
void printOwing(){
printBanner();
System.out.println("name: " + _name);
System.out.println("amount: " + getOutstanding());
}
リビジョン N + 1
void printOwing(){
printBanner();
printDetails(getOutstanding());
}
条件1 : 行の追加および削除が行われた
削除された行
メソッドが存在する
System.out.println("name: " + _name);
System.out.println("amount: " + getOutstanding());
条件3 : 新たに追加されたメソッドを
呼び出している
類似度が閾値(0.3)以上であれば
void printDetails(double outstanding){
条件2
: 新たに追加された
メソッド抽出が行われたとする.
System.out.println("name: " + _name);
メソッドが存在する
System.out.println("amount: " + outstanding);
}
11
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
調査するメトリクス
• メソッドの長さと凝集度を表すメトリクス
– 長さを測るメトリクス1つ
– 凝集度を測るメトリクス3つ
メソッドの長さ
メソッドの凝集度
メソッド中の文数
(Number Of Statements : NOS)
スライスベースの凝集度メトリクス
Tightness, Coverage, Overlap
12
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
凝集度メトリクス
• スライスベースの凝集度メトリクス [6]
– プログラムスライスを用いて凝集度を計測する
– メソッドの出力変数に着目したメトリクス
– 0から1の範囲の実数値で値が高いほど凝集度が高い
• Tsantalisらの定義に従って計算する [7]
– 出力変数 ・・・ メソッド本体とスコープが一致する変数
– 出力変数が存在しないメソッドの凝集度は計算できない
[6] M. Weiser, “Program slicing”, 1981.
[7] N. Tsantalis et al., “Identification of extract method refactoring opportunities for
the decomposition of methods”, 2011.
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
13
プログラム依存グラフ(PDG)
• プログラム中の依存関係を表したグラフ
– 頂点は文,辺は依存関係を表す
1 int factorial(int a){
2 int result = 1;
3 int i;
4 for(i = a;1 < i;i--){
result *= i;
5
6 }
7
8 return result;
9 }
2
3
4
文
制御文
5
データ依存辺
8
制御依存辺
PDG
14
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
プログラムスライス
• スライス基準(文と変数の組)と関連する文の集合
– 基準から後ろ向きに辺をたどって得られる集合を後ろ
向きスライスという
1 int factorial(int a){
2 int result = 1;
3 int i;
4 for(i = a;1 < i;i--){
result *= i;
5
6 }
7
8 return result;
9 }
2
3
4
5
スライシング基準 :
<5, result>
後ろ向きスライス :
{3,4,5}
8
15
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
凝集度の計算例
SL
SLiint SLSL
result int
11 SL
Coverage
0.6 スライスの積集合
) ) 0.80.8
Overlap
 ((
Tightness
M
M
22 M
SLi
SLresult
int
SLi SLresult SLint
1 int factorial(int a){
2 int result = 1;
3 int i;
4 for(i = a;1 < i;i--){
result *= i;
5
6 }
7
8 return result;
9 }
|
|
|
|
|
|
|
|
|
|
出力変数の後ろ向き
出力変数のスライスが
スライスを計算
出力変数のスライスが
全ての出力変数に関わる
どの程度メソッド全体に
文がどの程度存在するか
どの程度重複しているか
広がっているか
|
16
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
調査対象のメソッド
• NOSの比較には全メソッドを使用
• 凝集度の比較には凝集度が計算できたメソッ
ドのみを使用(表中の括弧内数)
メソッド抽出事例数
比較用バージョン
メソッド数
jEdit
490(286)
4.5.0
6275(2114)
ArgoUML
659(302)
1.8.4
9123(2167)
Apache Ant
704(322)
0.34
13840(4457)
17
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
NOS分布
• 抽出対象のメソッドはNOSが多い
5 10 20
1
2
NOS
NOS
100
500
‒ 有意水準0.05で有意差あり
リリース 抽出
jEdit
リリース 抽出
Ant
リリース 抽出
ArgoUML
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
18
凝集度の比較結果
• 3つの対象ソフトウェアで近い結果
– 抽出対象のメソッドは凝集度が低い
• メトリクスごとの結果について説明
– Antに対する結果のみ
19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
Tightness 分布
0.5
0.0
凝集度
Cohesion
1.0
• 全てのソフトウェアで有意差ありの検定結果
• 抽出されるのは0.2以下の値のメソッドが多い
リリース
抽出
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
20
Coverage 分布
0.5
0.0
凝集度
Cohesion
1.0
• jEditのみ有意差なしの検定結果
• Tightnessに値の分布が近い
リリース
抽出
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
21
Overlap 分布
0.5
0.0
凝集度
Cohesion
1.0
• 全てのソフトウェアで有意差ありの検定結果
• 値の分布が広い
• 値が1となるメソッドが非常に多い
リリース
抽出
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
22
調査結果のまとめ
• 抽出対象のメソッドはNOSが多く凝集度が低い
– 長く,機能的まとまりのないメソッドが対象になる
有意差
NOS
あり
Tightness
あり
Coverage
Overlap
jEditのみなし
あり
比較調査の結果
抽出対象となるメソッドはNOSが多い
抽出対象となるメソッドは値が0.2以下
のメソッドが多い
差が小さく有意差がない場合もある
有意差はあるが値の分布が特徴的
23
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
まとめ
• 抽出対象となるメソッドの特徴を調査
‒ 3つのソフトウェアを対象に調査
‒ リリース版に存在するメソッドと特徴を比較
• 抽出対象となるメソッドは文数が多く,凝集度
が低い
‒ 検定によって有意な差がみられた
24
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
今後の課題
• より大規模な調査の実施
– 対象ソフトウェア,メトリクス(複雑度など)を追加し
た調査
• メソッド抽出候補の推薦手法の提案
– 調査した特徴の差異を利用する
25
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University