クローンベースの分析 - Software Engineering Laboratory

コードクローン統合分析ツール ICCA
肥後 芳樹† ,吉田 則裕† ,神谷 年洋‡,楠本 真二† ,井上 克郎†
†大阪大学 大学院情報科学研究科
{y-higo, n-yosida, kusumoto, inoue}@ist.osaka-u.ac.jp
‡科学技術振興機構 さきがけ
[email protected]
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
1
ICCA - 概要(1/2)
GUI ベースの統合分析ツール
CCFinder をコードクローン検出エンジンとして使用
目的別にサブコンポーネントが存在
可視化,理解支援 - Gemini コンポーネント
リファクタリング支援 - Aries コンポーネント
デバッグ支援 - Libra コンポーネント
実装言語
Java
規模
ファイル数 : 523
総行数 : 約136,000行
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
2
ICCA - 概要(2/2)
ICCA (Integrated Code Clone Analyzer)
Code clone detector
(CCFinder)
Subsystem
Refactoring Support
Aries
Software Understanding
Software Visualization
Gemini
Debug Support
Libra
User
Code clone
repository
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
3
クローンペア と クローンセット
クローンペア: 互いに一致・類似しているコード片の対
クローンセット: 互いに一致・類似しているコード片の集合
以前はクローンクラスと言っていました
クローンペア
クローンセット
(C1, C4)
{C1, C4, C5}
C2
(C1, C5)
{C2, C3}
C3
(C2, C3)
C4
(C4, C5)
C1
C5
CCFinder はコードクローンをクローンペアとして検出する
CCFinder 配布セットには CCReformer というツールが含まれており,このツー
ルを用いるとクローンペアをクローンセットに変換することができる
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
4
Gemini - 概要
目的
CCFinder の検出したコードクローンの可視化・理解支援
これまでに配布している Gemini の機能強化版
旧 Gemini との比較
分析の分離
旧 Gemini : 全てのビューが密接に関連
新 Gemini : “クローンベースの分析”と”ファイルベースの分析”
スケーラビリティの改善
旧 Gemini : 数万行(検出したクローンの量に依存)
新 Gemini : 数百万行(検出したクローンの量に依存)
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
5
Gemini - 分析の分離
旧 Gemini では全てのビューが密接に関連をしている
理解しにくい
分析を “クローンベースの分析” と “ファイルベースの分析” に分
離
クローンベースの分析
ファイルベースの分析
メトリクスグラフ
スキャタープロット
クローンセットリスト
ファイルリスト
ソースコードビュー
グループリスト
ディレクトリツリー
ソースコードビュー
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
6
Gemini - スキャタープロット
a b c a b c a d e c
a b c a b c a d e c
原点は左上角
水平軸,垂直軸はソースコードの
トークン列を表す
黒い点は,両軸の対応したトークン
が一致していることを表す
主対角線上では自己比較が行
われるため,常に主対角線が描
画される
CCFinderから検出されてくるよ
うなクローンペアは,対角線分と
して現れる
a, b, c, ... : tokens
: matched position
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
7
Gemini - メトリクスグラフ(1/3)
メトリクスグラフで用いているメトリクス
LEN(S) : クローンセット S に含まれるコード片のトークン数の平均値
POP(S) : S に含まれるコード片の数
DFL(S) : S に含まれる全てのコード片を1つのサブルーチンにマージした場合の
トークン減少数の予測値
new sub routine
caller statements
RAD(S) : S に含まれるコード片がファイルシステム内での分散度
全てのコード片が1つのファイル内に存在 : RAD(S) = 0
全てのコード片が1つのディレクトリ内に存在 : RAD(S) = 1
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
8
Gemini - メトリクスグラフ(2/3)
メトリクスの続き
RNR(S) : S に含まれるコード片がどの程度”非繰り返し”であるか
を表す.
例 : 以下のトークン列を考える
このトークン列から,CCFinder はコード片 F1とF2 がクローンに
なっていると検出する.
この時 RNR(S) は以下の式で計算される
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
9
Gemini - メトリクスグラフ(3/3)
パラレルコーディネーショングラフ
各メトリクス毎に平行座標軸
1つのクローンセットにつき,1本の折れ線を描画
RAD
LEN
POP
DFL
RNR
4
3
2
1
0
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
10
Gemini - スケーラビリティの改善
旧 Gemini において著しくスケーラビリティを低下させていたのはスキャ
タープロット(クローンペアデータ)
スキャタープロットの改善
ズーム機能
旧 Gemini : 50倍が限度
新 Gemini : 1つのファイルにまで拡大可能
クローンのレンダリング
旧 Gemini :常に1つのクローンペアにつき,1本の線分を描画
新 Gemini : 状況に応じて,複数のクローンをまとめて描画
なくなった機能
ソーティング機能
旧 Gemini : ファイルID,クローン率などで並び替えが可能
新 Gemini : 並び替えは不可能
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
11
Gemini – 分析例(デモンストレーション)
クローンベースの分析
1例
ファイルベースの分析
3例
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
12
Gemini - クローンベースの分析例
目的
クローンセットをその特徴に基づいて絞込みを行う
解析の流れ(例)
1. メトリクスグラフを用いてクローンセットの絞込み
2. クローンセットリストを用いて,絞り込んだクローンセットのソーティング
3. ソースコードビューを用いて絞り込んだクローンのソースコード閲覧
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
13
Gemini - ファイルベースの分析例(1/2)
目的
ファイルをその情報に基づいて絞込みを行う
解析の流れ(例)
例1: ディレクトリツリーから
1. ディレクトリツリーでファイル(またはディレクトリ)を選択
2. スキャタープロットでクローン分布状態を確認
3. ソースコードビューでファイルのソースコードを閲覧
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
14
Gemini - ファイルベースの分析(2/2)
解析の流れ(続き)
例2: ファイルリストから
ファイルリストで定量的な値に基づき,ファイルを選択
選択されたファイルとクローンを共有しているファイルを確認
ソースコードビューで選択されたファイルのソースコードを閲覧
例3: グループリストから
グループリストでクローン率が高いグループを選択
選択されたグループに含まれているファイルを確認
選択されたグループと他の各グループとの類似度を確認
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
15
Gemini - ファイルメトリクス
NOL(f): ファイル f の行数
NOT(f): f のトークン数
NOC(f): f に含まれているコードクローンの数
ROC(f): f がどの程度クローンになっているかを表す
例: ファイル f1 は 200 トークンから成り,そのうちの 100 トークンが
コードクローンになっている
ROC(f1) = (100 / 200) × 100% = 50%
NOF(f): f とクローンを共有しているファイルの数
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
16
Gemini – フラグメントリスト
コードフラグメントの属性
ファイル内位置
開始行.開始列 - 終了行.終了列
長さ
トークン数
分散度(ディレクトリ構造上どの程度広がっているか)
Dense: 全てのクローンが同一ファイル内に存在
Middle: 全てのクローンが同一ディレクトリ内に存在
Scattered: クローンはディレクトリをまたがって存在
同形コードフラグメントの数
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
17
Gemini – グループメトリクス
NOF(g): グループ g に含まれるファイルの数
NOL(g): g に含まれるファイルの行数の和
NOT(g): g に含まれるファイルのトークン数の和
NOC(g): g に含まれるコードクローンの数
ROC(g): g がどの程度クローンになっているかを表す
例1.
g1 にはファイル f1 と f2 が含まれている
f1 は 200 トークンから成り,そのうちの 20 トークンがクローンと
成っている
f2 は 300 トークンから成り,そのうちの 80 トークンがクローンと
成っている
ROC(g1) = (20 + 80) / (200 + 300) ×100% = 20%
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
18
Aries - 概要(1/2)
目的
コードクローンの集約(リファクタリング)支援
リファクタリング支援のための処理
理由
CCFinder はコードクローンとトークンの列として検出するために,
検出されたコードクローンはリファクタリングに適しているとは言え
ない
処理内容
CCFinder の検出したクローンから,まとまりのある部分を抽出
抽出部分を,メトリクスを用いて定量的な特徴づけ
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
19
Aries - 概要(2/2)
一般的なリファクタリングプロセス
1. リファクタリング箇所の特定
2. リファクタリング方法の選定
3. リファクタリング効果の調査
4. ソースコードの修正
5. 回帰テストの実施
Aries では 1. と 2. をサポート
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
20
Aries - リファクタリング箇所の抽出
目的
CCFinder はトークンの列としてコードクローンを検出
検出された全てのコードクローンがリファクタリング可能ではない
リファクタリングのできそうな部分を抽出することで,より効率的なリ
ファクタリング支援ができる
抽出箇所
プログラミング言語での構造的なまとまり
例: Java 言語
宣言単位 : クラス宣言, インターフェース宣言
メソッド単位 : メソッド本体,コンストラクタ,
文単位 : do文,for文,if文,switch文,synchronized文,
try 文,while文
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
21
fragment 1
609:
610:
611:
612:
613:
614:
615:
616:
617:
618:
619:
620:
621:
622:
623:
624:
625:
626:
627:
628:
reset();
grammar = g;
// Lookup make-switch threshold in the grammar generic options
if (grammar.hasOption("codeGenMakeSwitchThreshold")) {
try {
makeSwitchThreshold = grammar.getIntegerOption("codeGenMakeSwitchThreshold");
//System.out.println("setting codeGenMakeSwitchThreshold to " + makeSwitchThreshold);
} catch (NumberFormatException e) {
tool.error(
"option 'codeGenMakeSwitchThreshold' must be an integer",
grammar.getClassName(),
grammar.getOption("codeGenMakeSwitchThreshold").getLine()
);
}
}
CCFinder が検出する
コードクローン
// Lookup bitset-test threshold in the grammar generic options
if (grammar.hasOption("codeGenBitsetTestThreshold")) {
try {
bitsetTestThreshold = grammar.getIntegerOption("codeGenBitsetTestThreshold");
fragment 2
623:
624:
625:
626:
627:
628:
629:
630:
631:
632:
633:
634:
635:
636:
637:
638:
639:
640:
641:
642:
}
// Lookup bitset-test threshold in the grammar generic options
if (grammar.hasOption("codeGenBitsetTestThreshold")) {
try {
bitsetTestThreshold = grammar.getIntegerOption("codeGenBitsetTestThreshold");
//System.out.println("setting codeGenBitsetTestThreshold to " + bitsetTestThreshold);
} catch (NumberFormatException e) {
tool.error(
"option 'codeGenBitsetTestThreshold' must be an integer",
grammar.getClassName(),
grammar.getOption("codeGenBitsetTestThreshold").getLine()
);
}
}
Aries が抽出する部
分
// Lookup debug code-gen in the grammar generic options
if (grammar.hasOption("codeGenDebug")) {
Token t = grammar.getOption("codeGenDebug");
if (t.getText().equals("true")) {
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
22
fragment 3
1007:
1008:
1009:
1010:
1011:
1012:
1013:
1014:
1015:
1016:
1017:
1018:
1019:
if ( inputState.guessing==0 ) {
buf.append(a.getText());
}
{
_loop144:
do {
if ((LA(1)==WILDCARD)) {
match(WILDCARD);
a=id();
if ( inputState.guessing==0 ) {
buf.append('.'); buf.append(a.getText());
}
}
CCFinder が検出する
コードクローン
fragment 4
1527:
1528:
1529:
1530:
1531:
1532:
1533:
1534:
1535:
1536:
1537:
1538:
1539:
if ( inputState.guessing==0 ) {
t=a.getText();
}
{
_loop84:
do {
if ((LA(1)==COMMA)) {
match(COMMA);
id();
if ( inputState.guessing==0 ) {
t+=","+b.getText();
}
}
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
23
Aries - メトリクスを用いた特徴づけ(1/2)
目的
抽出した部分はメソッドなどのまとまりのあるクローンになっているが,
それらがどのようにリファクタリング可能であるかは不明
人が各抽出部分がどのように集約できるかを調査するのは非効率
メトリクスを用いて特徴づけを行い,どのように集約できるかを予測
どのように集約できるか
既存のリファクタリングパターンを用いる
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
24
Aries - メトリクスを用いた特徴づけ(2/2)
以下のリファクタリングパターン[1][2]が,コードクローンの集約に用いることができる
Extract Class,
Extract Method,
Extract Super Class,
Form Template Method,
Move Method,
Parameterize Method,
Pull Up Constructor,
Pull Up Method,
Aries は抽出した各クローンに対して,上記のリファクタリングパターンのどれが適して
いるかを示す
[1]: M. Fowler: Refactoring: Improving the Design of Existing Code, Addison-Wesley, 1999.
[2]: http://www.refactoring.com/, 2004.
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
25
Aries - ボリュームメトリクス(LEN, POP, DFL)
メトリクスグラフで用いているメトリクス
LEN(S) : S に含まれるコード片のトークン数の平均値
POP(S) : S に含まれるコード片の数
DFL(S) : S に含まれる全てのコード片を1つのサブルーチンにマー
ジした場合のトークン減少数の予測値
new sub routine
caller statements
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
26
例:
・クローンセット S1 は f1 と f2 を含んでいる
・コード片 f1 では, 外部定義の変数 b と c に対して参照,
a に対して代入を行っている
NRV(S): S に含まれるコード片が,その外部で定義された変数をどの程度参照して
・コード片 f2 では f1 と同様の処理が行われているとする
いるかを表す
NSV(S): S に含まれるコード片が,その外部で定義された変数に対してどの程度代
then,NRV(S) = ( 2 + 2 ) / 2 = 2
入を行っているかを表す
NSV(S) = ( 1 + 1 ) / 2 = 1
Aries - 結合度メトリクス(NRV, NSV)
定義
int a , b, c;
コード片 f1
…
if( … ){
reference
…;
assignment
クローンセット
… =S bはコード片
+ c; f1, f2, ・・・, fn を含んでいる
si はコード片
i の内部で参照されている外部定義変数の数を表す
a = f…;
ti はコード片
…;fi の内部で代入されている外部定義変数の数を表す
}
…
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
27
例 2:
例 3:
・クローンセット S はコード片 f1 ,f2を含んでいる
・クローンセット S はコード片 f1 , f2 を含んでいる
・f1 を含むクラスと,f2を含むクラスの直接の親クラス
・ コード片f
1 を含むクラスと コード片f2 を含むクラス
例
1:
が共通であった場合,
が共通の親クラスを持っていない場合,
DCH(S): S に含まれるコード片がクラス階層において,どの程度広く
・クローンセット
S はコード片 f1 ,f2を含んでいる
分散しているかを表す ・コード片f
DCH(S)
=1
1 を含むクラスとコード片f
2を含むクラスが
DCH(S)
=
∞
同一であった場合,
DCH(S) = 0
Aries - 分散度メトリクス(DCH)
定義
クラス A
S はコード片
f1, f2, ・・・,fn を含む
class
B
class Aクローンセット
クラス Af はクラス C 中に存在する
コード片
コード片 f1
i
i
コード片 f2 C , C , ・・・,C の共通の親クラスのうち,クラス階層
クラス
Cfp1 は,クラス
1
2
n
コード片
的に最も下に位置するクラスを表す
コード片 f2
クラス C Ci と クラス Cj のクラス階層内での距離を現す
クラス B D(Ci, Cj) はクラス
コード片 f1
コード片 f2
もしクラス C1,C2,・・・,Cn が共通の親クラスを持たない時は DCH(S) は
∞ とする
このメトリクスは対象ソフトウェアのクラス階層内のみで計算される
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
28
Aries - 分析手順(デモンストレーション)
1. クローンセットの絞込み
 メトリクスグラフ
 メトリクス値による絞込み
 ユニットセレクションチェックボックス
 単位による絞込み
2. クローンセットの選択
 クローンセットリスト
 各メトリクス値に基づいたソーティングが可能
3. 選択したクローンセット情報の取得
 クローンセットビューワー
 コード片のリスト
 ソースコード
 コードクローン内で用いている外部定義変数一覧
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
29
Aries - 変数の種類
this_class_field
自クラスのフィールド
super_class_field
親クラスのフィールド
Interface_field
インターフェースのフィールド
local
ローカル変数
outer
外側のクラス内で定義された変数
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
30
Libra - 概要
目的
ソースコード修正(デバッグ,機能追加など)の支援
あるコードクローンに対して修正を行うと,それと対応する全ての
コードクローンに対して,同様の修正の是非を考慮する必要が
ある
Gemini コンポーネントとの違い
ユーザは検出したいコード片を入力
無駄なコードクローンは検出しない
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
31
Libra - 検出手法
CCFinder の検出オプションを利用
CCFinder は以下の 3タイプのクローン検出のオン,オフがオプションで指定でき
る
ファイル内クローン
ファイル間クローン
グループ間クローン
ユーザが入力したコード片をグループ1,対象ソースコードをグループ2として,グ
ループ間クローンのみを検出するオプションをつけて,CCFinder を実行する
この検出手法のメリット
検出時間の短縮
CCFinder はコードクローンを検出した後,ソーティングを行ってからコードク
ローンを出力する
無駄なクローンを検出しないことで,ソーティング時間を短縮できる
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
32
Libra - 分析手順(デモンストレーション)
1.
2.
3.
4.
コードクローン検出対象ファイルを選択
検出を行うコード片を入力
ディレクトリツリーで,どのファイルにクローンが含まれているのかを確認
ソースコードビューで,ファイルのどの部分がクローンになっているのかを
確認
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
33
日立システムアンドサービス
での適用事例
肥後 芳樹† ,前田憲一‡
†大阪大学 大学院情報科学研究科
[email protected]
‡株式会社 日立システムアンドサービス
[email protected]
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
34
適用対象
対象ソフトウェア
日立システムアンドサービス(社内システム)
規模
行数: 約7万行
クラス数: 309
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
35
コードクローン検出
検出オプション
最小一致トークン数: 50(約10行)
以下のユーザ定義名の正規化は行わない
変数の型
リテラル
メソッド名
検出クローンセット数
宣言単位: 4
メソッド単位: 13
文単位: 49
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
36
用いたリファクタリングパターン
宣言,メソッド,文単位のクローンセットに対して以下のリファクタリング
パターンの適用を試みた.
宣言単位: Extract Super Class
クローンとなっているクラスに対して共通の親クラスを作成
共通の機能は親クラスに引き上げ
クラスがまったく同一の場合は,1つを残して他は削除
メソッド単位: Move Method
ユーティリティクラス等に移動
文単位: Extract Method
メソッド内の一部分を新たなメソッドとして抽出
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
37
パターン1: Extract Super Class
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
38
パターン2: Move Method
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
39
パターン3: Extract Method
void printOwing() {
printBanner(); //print details
System.out.println ("name: " + _name);
System.out.println ("amount " + getOutstanding()); }
void printOwing() {
printBanner();
printDetails(getOutstanding());
}
void printDetails (double outstanding) {
System.out.println ("name: " + _name);
System.out.println ("amount " + outstanding);
}
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
40
絞込み条件
Extract Super Class
クラス単位のクローンセット
親クラスのメンバを用いていない(NSV,NRV が0)
共通の親クラスがない(DCH が∞)
Move Method
メソッド本体のクローンセット
現在定義されているクラスのメンバを用いていない(NSV,NRVが0)
Extract Method
文単位のクローンセット
クローン外部で定義された変数に対しては,高々1つにしか代入を行っていない
(NSV が1以下)
全てのクローンが単一のクラス内に存在する(DCHが0)
3つ以上同一のコード片が存在(POPが3以上)
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
41
絞込み結果
検出クローンセット数
宣言単位: 4
メソッド単位: 13
文単位: 49
絞込み条件に一致したクローンセット数
Extract super Class: 4
Move Method: 5
Extract Method: 12
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
42
評価方法(1/3)
絞り込まれた各クローンセットに対して以下の評価を行って頂いた
クローンの現在の状態について( (a),(b)から選択)
ソフトウェアのサイズ(※1)
ソフトウェアのデザイン(※2)
クラスの凝集度(※3)
クラス間の結合度(※4)
パフォーマンス
(a)悪化させている, (b) 影響していない
※1 モジュール(クラスやメソッドなど)のステップ数やトークン数を表す
※2 クラスの階層構造やカプセル化を表す
※3 1つのクラスが責任を持って1つの機能を提供しているかを表す.1つのクラスが複数の事柄を扱っていたり,また
特に何も機能を提供していない場合は,凝集度的にみて悪い(低い)ことを表す
※4 他のクラスのフィールドやメソッドを用いていることを表す.フィールドやメソッドが適切なクラスに定義されていないと
必要以上に他クラスのフィールドやメソッドを呼び出すことになり,結合度的にみて悪い(高い)ことを表す.
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
43
評価方法(2/3)
評価の続き
リファクタリングの効果について( (a) (b) (c) (d) から選択)
サイズ面
デザイン面
クラスの凝集度の面
クラス間の結合度の面
パフォーマンス面
ソースコードの可読性
ソースコードの再利用性
(a) 改善される,(b) 将来的な問題の予防にはなる,
(c) 効果なし,(d) 悪化する
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
44
評価方法(3/3)
評価の続き
リファクタリングのコストについて((a) (b) (c) から選択)
ソースコードの修正
回帰テスト
(a)非常に煩雑,(b)少し手間がかかる,(c) すぐに完了できる
総合的な評価((a) (b) (c) (d) から選択)
このクローンセットは
(a) すぐにリファクタリングすべき
(b) 将来的にはリファクタリングすべき
(c) リファクタリングしてもしなくてもよい
(d) リファクタリングすべきではない
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
45
評価結果 - Extract Super Class(1/3)
(クラス単位の)クローンの現在の状態
(a) 悪化させている
(b) 影響していない
ソフトウェアのサイズついて
4
0
ソフトウェアのデザインについて
4
0
クラスの凝集度について
0
4
クラス間の結合度について
0
4
パフォーマンスについて
0
4
全てのクローンセットがサイズとデザインを悪化させていた
どのクローンセットも凝集度,結合度,パフォーマンスには影響して
いなかった
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
46
評価結果 - Extract Super Class(2/3)
(クラス単位の)リファクタリングの効果
(b) 将来的な問題の
予防にはなる
(a) 改善される
(c) 効果なし
(d) 悪化する
サイズ
2
2
0
0
デザイン
2
2
0
0
クラスの凝集度
0
0
4
0
クラス間の結合度
0
0
4
0
パフォーマンス
0
0
4
0
ソースコードの可読性
1
3
0
0
ソースコードの再利用性
1
3
0
0
全てのクローンセットのリファクタリングがサイズ,デザイン,可読性,
再利用性の面で有効である
どのクローンセットのリファクタリングも凝集度,結合度,パフォーマン
ス面では効果がない
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
47
評価結果 - Extract Super Class(3/3)
(クラス単位の)リファクタリングのコスト
(a) 非常に煩雑である
(b) 少し手間がかかる
(c) すぐに完了できる
ソースコードの修正は
0
3
1
回帰テストは
2
1
1
ソースコードの修正はそれほどコストがかからない
回帰テストは煩雑になる場合がある
(クラス単位の)総合的な評価
(a) すぐにすべき
リファクタリングを
2
(b) 将来的には
すべき
(c) してもしなくて
もよい
2
(d) すべきではない
0
0
全てのクローンセットがリファクタリングするべき
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
48
評価結果 - Move Method(1/3)
(メソッド単位の)クローンの現在の状態
(a) 悪化させている
(b) 影響していない
ソフトウェアのサイズついて
5
0
ソフトウェアのデザインについて
5
0
クラスの凝集度について
4
1
クラス間の結合度について
0
5
パフォーマンスについて
1
4
全てのクローンセットがサイズ,デザインを悪化させていた.
多くのクローンセットが凝集度を悪化させていた
リファクタリングすべき箇所を検出できている
ほとんどのクローンセットが結合度,パフォーマンスには影響していな
かった
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
49
評価結果 - Move Method(2/3)
(メソッド単位の)リファクタリングの効果
(a) 改善される
(b) 将来的な問題の
予防にはなる
サイズ
5
0
0
0
デザイン
5
0
0
0
クラスの凝集度
5
0
0
0
クラス間の結合度
0
0
5
0
パフォーマンス
0
0
5
0
ソースコードの可読性
4
1
0
0
ソースコードの再利用性
4
1
0
0
(c) 効果なし
(d) 悪化する
全てのクローンセットのリファクタリングがサイズ,デザイン,凝集度,
可読性,再利用性の面で有効である
どのクローンセットのリファクタリングも結合度,パフォーマンス面では
効果がない
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
50
評価結果 - Move Method(3/3)
(メソッド単位の)リファクタリングのコスト
(a) 非常に煩雑である
(b) 少し手間がかかる
(c) すぐに完了できる
ソースコードの修正は
0
0
5
回帰テストは
0
0
5
ソースコードの修正,回帰テスト共にそれほどコストがかからない
(メソッド単位の)総合的な評価
(a) すぐにすべき
リファクタリングを
4
(b) 将来的には (c ) してもしなくて
すべき
もよい
1
(d) すべきではない
0
0
全てのクローンセットがリファクタリングするべき
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
51
評価結果 ー Extract Method(1/3)
(文単位の)クローンの現在の状態
(a) 悪化させている
(b) 影響していない
ソフトウェアのサイズついて
2
10
ソフトウェアのデザインについて
2
10
クラスの凝集度について
0
12
クラス間の結合度について
0
12
パフォーマンスについて
0
12
一部のクローンセットがサイズ,デザインを悪化させていた.
全てのクローンセットが凝集度,結合度,パフォーマンスには影響し
ていなかった
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
52
評価結果 - (2/3)
(文単位の)リファクタリングの効果
(b) 将来的な問題の
予防にはなる
(a) 改善される
(c) 効果なし
(d) 悪化する
サイズ
0
5
4
3
デザイン
0
3
3
6
クラスの凝集度
0
0
12
0
クラス間の結合度
0
0
12
0
パフォーマンス
0
0
12
0
ソースコードの可読性
0
4
3
5
ソースコードの再利用性
2
2
4
4
サイズ,デザイン,可読性,再利用性は,リファクタリングの効果あり,
効果なし,逆効果に分かれた
全てのリファクタリングが凝集度,結合度,パフォーマンスについては
効果がなかった
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
53
評価結果 - (3/3)
(文単位の)リファクタリングのコスト
(a) 非常に煩雑である
ソースコードの修正は
回帰テストは
(b) 少し手間がかかる
(c) すぐに完了できる
4
5
3
4
6
2
半数のクローンセットが,ソースコード修正・回帰テスト共にコストが
大きい
(文単位の)総合的な評価
(a) すぐにすべき
リファクタリングを
0
(b) 将来的には
すべき
3
(c) してもしなくて
もよい
(d) すべきではない
3
6
半数のクローンセットがリファクタリングすべきでない
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
54
考察
クラス単位,メソッド単位のクローンセットはリファクタリングすべき
対象のクローンセットはソフトウェアの保守性を悪化させていた
リファクタリングにより保守性の改善を期待できる
コストがそれほどかからない
文単位のクローンセットはリファクタリングすべきでないものが存在した
メソッドの一部分を抽出する作業は煩雑
条件をきつくする
修正支援を行う
用いているフレームワークに依存したクローンセット
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
55
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
56
CCFinder:
Clone Detection Process
Source files
throws
{{ String
(( (( )) )) throws
$$ $$foo
foofoo()
1. static
void
throws
RESyntaxException
static
throws$$RESyntaxException
RESyntaxException
String aa {
static void
throws
{{ $$ $$
new
]{{] {{$$ "123,400"
,
[[ [[]] String
$$String
$$ =
new
]] == a[]
String
$[] { "123,400",
2. [[String
new
"abc", "orange 100" };
"abc"
,
"orange
100"
}
;
org
.
apache
.
regexp
;
}
} ;
3. org.apache.regexp.RE
pat = new org.apache.regexp.RE("[0-9,]+");
new
$$ ==
$$ pat
==new
new
4. .intRE
sum
0; org . apache . regexp
. RE
) ; int
== $$00
$
$$ (( "[0-9,]+"
"[0-9,]+"
int
sum
$$ sum
$$ =
5. for
(int i$ = 0; i) < ;a.length;
++i)
;; for
<
$$ i$$i ==
int
for (( int
= 0$$0 ;;; i$$i <<
6. a$ if. (pat.match(a[i]))
;; ++
if ifif(( (($$ pat
$$ ;; ++
length
++$$ ii)) ))if
pat
$ . length
++
7. .. match
sum
+=
Sample.parseNumber(pat.getParen(0));
$$ (( (( $$ aa [[ [[ $$ ii ]] ]] )) )) )) )) $$sum
sum
8. +=
System.out.println("sum
"getParen
+ sum);
(( 00
(( $$ .. $$ (( ((pat
$$ .. $.$. parseNumber
parseNumber
pat$$ .=
. getParen
+= Sample
9. } )) )) ;; System
.. .$$. println
$$ .. .$$. out
System
out
println
"sum==""
(( $$ (( "sum
static
String
$$ $$goo
}}}} static
))) ;;;; goo(String
$$ void
10. static
[] ((a)(( $$throws
RESyntaxException {
++ sum
static void
void
goo
String
static
]] ))) =throws
= {{ RE
$$RE("[0-9,]+");
[[ exp
throws
RESyntaxException
RE exp
exp ==
{{ $$ $$ =
11. a$$RE
newRESyntaxException
=sum$ == 00
$ ) ; )) $;; $int
$ (( "[0-9,]+"
int sum
12. newintRE
sum"[0-9,]+"
= 0;
for (( int
for
0$ ;; i$i <<
13. ;; for
(intint$i =i$i 0;== i 0<
a.length; ++i)
$ ; ++
;; ++
length
a$ .. length
++$ ii) ))if ifif( (($ exp
exp
14. . match
if
(exp.match(a[i]))
$ ( (( $ aa [ [[ $ ii ] ]] ) )) ) )) $sum
sum
15. += parseNumber
sum
+=
parseNumber(exp.getParen(0));
( . $ getParen
$ ( ( $exp. (. $exp
getParen
() 0) )( )0 ) )
$$ .. parseNumber
16. ;; System.out.println("sum
+ sum
sum);
( $ ((+ "sum
. .$. println
$ . $.. out
==""" ++
out
$ =
System
println
"sum
sum
17. })) ;; }}
Lexical
Lexical analysis
analysis
Token
Token sequence
sequence
Transformation
Transformation
Transformed
Transformed token
token sequence
sequence
Match
Match detection
detection
Clones
Clones on
on transformed
transformed sequence
sequence
Formatting
Formatting
Clone pairs
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
57
Aries - その他のメトリクス1(DOC)
DOC(S): そのクローンセットに含まれるコード片がどの程度異なるクラスに散らばって
いるか表す
例: クローンセット S は10個のコード片を含んでいるとする
全てのコード片が異なるクラスにある場合,
– DOC(S) = ( 10 – 1) / (10 – 1) = 1
5つのクラスにコード片がある場合,
– DOC(S) = (5 – 1) / (10 – 1) = 0.44
2つのクラスにコード片がある場合,
– DOC(S) = (2 – 1) / (10 -1) = 0.11
全てのコード片が同一のクラスにある場合,
– DOC(S) = (1 -1) / (10 -1) = 0
POPの値が大きいクローンセットに対して有効
全てのコード片を1つにまとめるのは難しい
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
58
Aries - その他のメトリクス2(SMT)
SMT(S): そのクローンセットに含まれる(メソッド単位の)コード片の返り値,引数の型が
どの程度一致するかを表す
現在の”一致”の定義
プリミティブ型の場合,
– まったく同一である時
オブジェクト型の場合,
– 同一の型もしくは,異なっていても共通の親クラスをもつオブジェクト型の時
例: メソッドAとメソッドBはクローンになっており(クローンセット S) ,それぞれ引数の
数は4つである.
全ての引数と返り値の型が一致する場合
– SMT(S) = (4 + 1) / (4 + 1) = 1
二つの引数の型が一致する場合
– SMT(S) = 2 / (4 + 1) = 0.4
全ての引数と返り値の型が一致しない場合
– SMT(S) = 0 / (4 + 1) = 0
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
59
Aries - その他のメトリクス3(KMC)
KMC(S): そのクローンセットに含まれるコード片が存在するメソッドが,
他のメソッドとどの程度結合しているかを表す
結合は以下の三種類で計る
メソッド呼び出しの引数
メソッド呼び出しの返り値
メソッド間の共有変数
KMC(S)の値が大きい
メソッド間の結合度が大きい
リファクタリングすべき?
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
60