リファクタリングの実施履歴を用いた 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
© Copyright 2025 ExpyDoc