Code Smellの深刻度 - Software Engineering Laboratory

リファクタリングの実施履歴を用いた
Code Smellの深刻度に関する調査
○雜賀翼1 崔恩瀞1 吉田則裕2 春名修介1 井上克郎1
1大阪大学 2名古屋大学
1
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
リファクタリング
• ソフトウェアの外部から見た動作を変えずに,
ソースコードを整理する作業[1]
– クラスやメソッドなどのプログラム要素が対象
外部から見た動作は同じ
リファクタリング
理解しにくい
ソースコード
理解しやすい
ソースコード
開発者
機能の追加, バグの修正
がしやすい
[1] M. Fowler. Refactoring:Improving the Design of Existing Code. Addison Wesley,1999.
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
2
Code Smell
• 設計上の問題を持ち, 保守性を悪化させてバグ
の原因になりやすいクラスやメソッドの特徴
• 開発者がリファクタリングを実施するべきソース
コードの指標として提案された[1]
Code Smellの例
Code Smell
説明
推奨されるリファクタリング
Blob Class
コードが長く複雑なクラス
クラスの抽出など
Blob Operation
コードが長く複雑なメソッド
メソッドの抽出など
Internal Duplication クラス内の他メソッドと重複 メソッドの抽出など
するコードのあるメソッド
[1] M. Fowler. Refactoring:Improving the Design of Existing Code. Addison Wesley,1999.
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
3
Code Smellの例1:Blob Class
• Blob Classを含むクラスについて, 推奨され
るクラス抽出リファクタリングを実施する例
クラスC
クラスC
長さ
クラスB
新クラス
クラスB
クラス抽出
クラスA
クラスを新しく作成し,
フィールドとメソッドを移動
クラスA
Blob Class
コードの行数が大きく,
複雑で理解しにくい
機能を他のクラスに分割することで,
コードの理解がしやすくなる
4
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
Code Smellの例2:Internal Duplication
• Internal Duplicationを含むメソッドについて, 推奨
されるメソッド抽出リファクタリングを実施する例
クラスA
クラスA
m1()
m1()
重複
m2()
m2()
メソッド抽出
メソッドを新しく作成し,
元のメソッドの一部を移動
Internal Duplication
クラス内の他のメソッド
とコードが重複している
m3()
メソッド
呼び出し
重複していたコードが一箇所にまと
まり, コードの理解がしやすくなる
5
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
Code Smell検出ツール
• リファクタリングを実施するべきソースコードの箇所
を特定することを目的として利用される
• Code Smellを自動検出し開発者に提示する
• 多くのツールは主にメトリクスを用いて検出する
例) Blob Classの検出手法[2]
LOC(行数) > VERY_HIGH
WMC(複雑度) > VERY_HIGH
AND
Blob Class
TCC(凝集度) < LOW
2つ以上のBlob operationを含む
[2] M. Lanza and R. Marinescu. Object-Oriented Metrics in Practice. Springer, 2006.
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
6
Code Smellの深刻度
• 数値化されたCode Smellの示す問題の大きさ
– 同じBlob Classでも500行と1000行とでは, 開発者のリファクタリ
ング実施に差があると推測される
• 各種類のCode Smellについて, 検出に用いるメトリクス値
を組み合わせて深刻度が測定される
– 深刻度はメトリクスに求められるWeyukerの性質[3]をCKメトリク
スと同様に満足する[4]
• メトリクス値の大きさからリファクタリング実施対象のソー
スコードを特定することが行なわれている[5]
[3] E. J. Weyuker. Evaluating software complexity measures. IEEE Tans Softw Eng., 1988.
[4] S.R. Chidamber et al. A Metrics Suite for Object Oriented Design”, IEEE Trans Softw Eng., 1994.
[5] F. Simon et al. Metrics based refactoring. In Proc of CSMR, 2001
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
7
研究動機
• 開発者がリファクタリング実施するCode Smellの
基準は明確にされていない
• 検出ツールと開発者でCode Smellの基準が大き
く異なると, 有用なCode Smellを提示できない
• ツールが検出するCode Smellが, 開発者のリファ
クタリング実施対象になるか調べる必要がある
8
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
Bavotaらの研究[6]
• リファクタリングがCode Smellのあるクラスを対
象に実施されるかを調査
– 3つのオープンソースソフトウェア(OSS)の開発履歴
を用いて調査
• リファクタリングとCode Smellの間に明確な関係
は見られなかった
– リファクタリングがCode Smellのあるクラスに実施さ
れた割合は42%
– リファクタリングがCode Smellを除去した割合は7%
[6] G. Bavota et al. An Experimental investigation on the Innate Relationship between
Quality and Refactoring. Journal of Systems and Software, 2015.
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
9
既存研究の問題点
• 同種類のCode Smellの中での深刻度の違いにつ
いて考慮されていない
– Code Smellの深刻度は, Code Smellの示す問題の大
きさを数値化したもので, メトリクス値から測定される
• リファクタリングの実施にはコストがかかるので, 全
てのCode Smellを除去することは困難である
– 同種類のCode Smellでも, 深刻度の高いものが優先し
てリファクタリングされやすいと推測される
– Code Smellを完全に除去せず, 深刻度を和らげる程度
にしかリファクタリングしない可能性もある
10
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
調査概要
• Code Smellの深刻度とリファクタリング実施の関
係について, 3つのOSSの開発履歴を調査
• リサーチクエスチョン(RQ)
– RQ1
深刻度の高いCode Smellを含むクラス・メソッドがよりリファ
クタリングされるか?
– RQ2
リファクタリングはCode Smellの深刻度を減少させるか?
11
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
調査対象のシステム
• 調査対象はJavaで書かれた3つのOSS
– Bavotaらの研究[6]と同じシステム
– 彼らが検出したリファクタリングの一覧も利用, 検出
結果は目視で正解か確認されたので信頼できる
各システムの概要
システム
データの収集期間
リリースの数
クラス数
リファクタリング
の総数
Xerces-J
1999年11月~2010年11月
34
19,567
6,052
ArgoUML
2002年10月~2011年12月
12
43,686
3,423
Apache Ant
2000年1月~2010年12月
18
22,768
1,493
[6] G. Bavota et al. “An Experimental investigation on the Innate Relationship between
Quality and Refactoring.” Journal of Systems and Software, 2015.
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
12
調査手順
各リリースバージョン
のソースコード
1. Code Smellの検出
inFusion
Code Smellの深刻度
2. Code Smellの
深刻度の増減の計測
Code Smellの深刻度の増減
3. リファクタリングによる
グループ分け
リファクタリングの一覧
リファクタリングされた
Code Smellのあるクラス
4. 2グループ間での有意差検定
リファクタリングされなかった
Code Smellのあるクラス
RQ1: 深刻度の高さについて
RQ2: 深刻度の増減について
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
13
Code Smellの検出
• メトリクスの値の特徴に基づいてCode Smellを
自動検出するツールInFusion*1を利用した
– Code Smellの深刻度を1~10の数値で評価する
• 深刻度1が最も軽微で, 深刻度10が最悪である
例)Blob Classの検出
1. メトリクスを計測
LOC(行数)
クラスA
WMC(複雑度)
inFusion
2. 種類の判定
3. 深刻度の判定
Blob Classの
メトリクス値の特徴
と一致すると判定
メトリクス値から
深刻度を判定
TCC(凝集度)
検出ツールの出力結果
*1http://www.intooitus.com/products/infusion
クラス
種類
深刻度
クラスA
Blob Class
4
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
14
調査手順
各リリースバージョン
のソースコード
1. Code Smellの検出
inFusion
Code Smellの深刻度
2. Code Smellの
深刻度の増減の計測
Code Smellの深刻度の増
減
3. リファクタリングによる
グループ分け
リファクタリングの一覧
リファクタリングされた
Code Smellのあるクラス
4. 2グループ間での有意差検定
リファクタリングされなかった
Code Smellのあるクラス
RQ1: 深刻度の高さについて
RQ2: 深刻度の増減について
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
15
Code Smellの深刻度の増減の計測
• 連続するリリースバージョン間で各Code Smellの
深刻度を比較し, 深刻度の増減を計測する
リリースkのCode Smell
クラスAのCode Smell
リリースk+1のCode Smell
クラスAのCode Smell
クラスレベル
クラスレベル
種類
深刻度
種類
深刻度
Blob Class
4
Blob Class
4
メソッドレベル
変化なし
0
メソッドレベル
増加
メソッド
種類
深刻度
メソッド
種類
深刻度
m1()
Blob Operation
5
m1()
Blob Operation
6
m2()
Blob Operation
1
m2()
-
0
Code Smellがなければ深刻度0とする
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
+1
減少
-1
16
調査手順
各リリースバージョン
のソースコード
1. Code Smellの検出
inFusion
Code Smellの深刻度
2. Code Smellの
深刻度の増減の計測
Code Smellの深刻度の増減
3. リファクタリングによる
グループ分け
リファクタリングの一覧
リファクタリングされた
Code Smell
4. 2グループ間での有意差検定
リファクタリングされなかった
Code Smell
RQ1: 深刻度の高さについて
RQ2: 深刻度の増減について
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
17
Code Smellに対応するリファクタリング
• Code Smellを含むクラスやメソッドに対してリ
ファクタリングが実施されているかを調べる
• ただし, Code Smellとは無関係に実施されたリ
ファクタリングは除外したい
• Fowler[1]やLanza[2]が各種Code Smellに対応
するとしているリファクタリングの種類に限定する
– 例)Blob Classに対応するリファクタリングの種類
• インタフェースの抽出, サブクラスの抽出, クラスの抽出,
オブジェクトによるデータ値の置き換え
[1] M. Fowler. Refactoring:Improving the Design of Existing Code. Addison Wesley,1999.
[2] M. Lanza and R. Marinescu. Object-Oriented Metrics in Practice. Springer, 2006.
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
18
調査手順
各リリースバージョン
のソースコード
1. Code Smellの検出
inFusion
Code Smellの深刻度
2. Code Smellの
深刻度の増減の計測
Code Smellの深刻度の増減
3. リファクタリングによる
グループ分け
リファクタリングの一覧
リファクタリングされた
Code Smell
4. 2グループ間での有意差検定
リファクタリングされなかった
Code Smell
RQ1: 深刻度の高さについて
RQ2: 深刻度の増減について
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
19
RQ1のための有意差検定
RQ1:
深刻度の高いCode Smellを含むクラス・メソッドがよりリファ
クタリングされるか?
リファクタリングされたクラス・メソッドは, そうでない
ものに比べて, 深刻度が有意に高いかを調べた
– マン・ホイットニーのU検定という, ノンパラメトリック
な有意差検定の一つを用いて片側検定を行なった
リファクタリングされたBlob Class
リリース クラス
リファクタリングされなかったBlob Class
深刻度
1
クラスA
4
1
クラスD
10
2
クラスA
4
リリース クラス
同じ種類のCode Smell
1
クラスB
4
1
クラスC
2
2
クラスB
8
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
…
…
深刻度の大きさの
順位を比較する
深刻度
20
RQ1の回答
コードスメルの種類
RQ1
Blob Class
Data Class
God Class
Tradition Breaker
Blob Operation
External Duplication
Feature Envy
Internal Duplication
Sibling Duplication
○
○
○
○:有意差あり(p<0.05), 空欄:有意差なし, n/a:検定不可
21
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
RQ2のための有意差検定
RQ2: リファクタリングはCode Smellの深刻度を減少させるか?
リファクタリングされたクラス・メソッドは, そうでないも
のに比べて, 深刻度の増減が有意に低いか調べた
– RQ1と同様にマン・ホイットニーのU検定を用いた
リファクタリングされたBlob Class
リリース クラス
深刻度
の増減
1→2
クラスA
0
1→2
クラスD
-4
2→3
クラスA
-2
リファクタリングされなかったBlob Class
リリース クラス
同じ種類のCode Smell
深刻度の増減の
順位を比較する
深刻度
の増減
1→2
クラスB
4
1→2
クラスC
-1
2→3
クラスB
1
…
…
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
22
RQ2の回答
コードスメルの種類
RQ2
Blob Class
Data Class
God Class
Tradition Breaker
Blob Operation
External Duplication
Feature Envy
Internal Duplication
Sibling Duplication
○
n/a
n/a
○
○
○:有意差あり(p<0.05), 空欄:有意差なし, n/a:検定不可
23
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
考察:Blob ClassとBlob Operation
• RQ1とRQ2で共通して有意差があるCode
SmellはBlob ClassとBlob Operation
– それぞれ深刻度の高いクラス・メソッドが優先してリ
ファクタリングされ, 深刻度が減少する傾向にある
• どちらもコードの行数の大きさ等を表すもの
– コードの行数は多くの開発者が気にするものであり,
長いものはリファクタリングの実施対象になりやすい
Blob ClassとBlob Operationについては, 深刻度の高い
Code Smellを開発者に優先的に提示することが有用である
24
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
考察:God Class
• 他のクラスと比べて責務の多過ぎるクラス
– 責務が多いためにコードの行数も大きいことが多い
が, Blob Classと違い検出規則に行数を含まない
対応するサブクラスの抽出等は多数実施された
が, 深刻度が減少した事例はわずかである
– リファクタリングの実施対象になったクラス数が多く,
God Classも良く知られているCode Smell
– 効果的にリファクタリングを実施することはフィール
ドとメソッドのクラスタを考える必要があり難しい
25
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
考察:Duplication(1/2)
• External Duplication:無関係なクラス間の重複
改善にはクラス抽出などハイレベルなリファクタリ
ングが必要だが, ほとんど実施されていなかった
• Internal Duplication:クラス内の重複
– 深刻度の低いものだけがリファクタリングされていた
– 対応するメソッドの抽出のリファクタリングが実施され
た場合のほとんどで深刻度が減少していた
重複する部分のメソッドの抽出が容易な場合に
リファクタリングが実施されやすいと考えられる
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
26
考察:Duplication(2/2)
• Sibling Duplication:兄弟クラス間の重複
– Internal Duplicationとは異なり深刻度の高いものにメ
ソッド抽出のリファクタリングが実施された
– しかし, メソッドの抽出で深刻度が減少していないので,
重複部分以外を対象としたものと推測される
メソッド抽出の後にメソッドの引き上げを実施するべきだが,
メソッド引き上げはハイレベルで実施されにくい
27
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
考察:Feature Envy
• 他のクラスのデータを多く用いるメソッド
対応するメソッド移動のリファクタリングが実施さ
れた場合のほとんどで深刻度が減少
– メソッド移動よる改善方法は明確で, リファクタリン
グは効果的に実施されやすい
• メソッドはリファクタリングされず, フィールドの移
動により深刻度が減少する事例が多い
28
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
まとめと今後の課題
• まとめ
– Code Smellの深刻度とリファクタリングの関係につ
いて3つのOSSを調査した
– Blob ClassとBlob Operationについては, 深刻度が
高いほどリファクタリングされやすい傾向があった
• 今後の課題
– 調査対象のシステムを増やす
29
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University