220 likes | 538 Views
CK メトリクスに基づくリファクタリングの 効果予測手法の提案と実装. 大阪大学 大学院情報科学研究科 ○松本義弘 肥後芳樹 楠本真二 井上克郎. 研究の背景. 将来的なソフトウェアの保守コストの削減を目的に,リファクタリング [1] と呼ばれる技術が研究されている. リファクタリングとは? ソフトウェアの外部的振る舞いを保ったまま,内部の構造を改善する技術 リファクタリングの効果は? ソフトウェアの保守性が向上する リファクタリングを実施するプロセスで,その効果を予測したいという要求がある.
E N D
CKメトリクスに基づくリファクタリングの効果予測手法の提案と実装CKメトリクスに基づくリファクタリングの効果予測手法の提案と実装 大阪大学 大学院情報科学研究科 ○松本義弘 肥後芳樹 楠本真二 井上克郎
研究の背景 • 将来的なソフトウェアの保守コストの削減を目的に,リファクタリング[1]と呼ばれる技術が研究されている. • リファクタリングとは? • ソフトウェアの外部的振る舞いを保ったまま,内部の構造を改善する技術 • リファクタリングの効果は? • ソフトウェアの保守性が向上する • リファクタリングを実施するプロセスで,その効果を予測したいという要求がある [1] M. Fowler, Refactoring: improving the design of existing code, Addison Wesley, 1999.
研究対象と目的 • 一般的に使われるリファクタリングプロセス[2] Step 1: どこにリファクタリングを適用すべきか決定する Step 2: どのようなリファクタリングを適用すべきかを決定する Step 3: リファクタリングの効果を予測する Step 4: プログラムを修正する Step 5: プログラムが正しく動作するかテストする [2] T Mens and T. Tourwé. A survey of software refactoring. IEEE Trans. Softw. Eng., 30(2):126–139, 2004.
関連研究 • リファクタリング位置特定/選択手法 • 構造的な欠陥(低凝集・高結合のクラスなど)を発見し,それに対して効果的なリファクタリングを提供[3] • リファクタリングの効果計測手法 • 高結合を解消するリファクタリングを,独自に定義した結合度メトリクスに基づいて定量的に評価する[4] [3]秦野, 乃村, 谷口, 牛島. ソフトウェアメトリクスを利用したリファクタリングの自動化支援機構. 情報処理学会論文誌,44(6):1548–1557, Jun 2003. [4]Y. Kataoka. T. Imai, H.Andou and T. Fukaya, A quantitative evaluation of maintainability enhancement by refactoring., In ICSM ’02, p. 576-585, 2002.
研究の概要 • 関連研究の問題 • リファクタリングは,高結合・低凝集なクラスだけが対象ではない • 「計算処理を行うクラスに画面描画の機能の一部が実装されているので適切なクラスに移動したい」 • このようなケースにおいても,リファクタリングを評価する必要がある • リファクタリング適用支援ツールを使っても,ソースコードの修正はコストがかかる • ソースコードを修正する前に,ソフトウェア保守に与える効果を知るべき • 研究目的 • ソースコードを修正する前に,リファクタリングが保守性に与える効果を予測する手法を提案・実装し,有用性を評価する
ソフトウェアの保守性 • 「機能仕様の変更や追加に対する修正のしやすさ」を表す • ソフトウェアの保守性を評価するためにソフトウェア複雑度メトリクスが用いられている[4]. • メトリクスが高く複雑であればあるほど修正のコストがかかり,保守が困難であると評価されている • 代表的なソフトウェア複雑度メトリクスとして,CKメトリクスがあげられる [4] 神谷年洋, オブジェクト指向メトリクスを用いた開発支援法に関する研究, PhD thesis, 大阪大学大学院基礎工学研究科, 2001.
CKメトリクス • CKメトリクスは以下の3つの観点からクラスの複雑さを評価する ※これらのメトリクスは,値が高いほどクラスが複雑であることを表す • 本研究では,CK メトリクスを用いてリファクタリングがソフトウェア保守に与える効果を予測する手法を提案する
System STEP1 Program プログラム解析 リファクタリングの箇所/リファクタリングパターン 解析情報β 解析情報α STEP2 リファクタリング箇所とパターンを取得 CK Metricsα STEP4 リファクタリング前後のメトリクスの変化率の計算 提案手法の概要 STEP3 CK Metricsβ
STEP1:対象プログラムの解析 • 対象プログラムの解析を行い,CKメトリクスを計測する. ソフトウェアを構成する全クラス 解析情報 ・クラス間の参照関係 ・メソッド間の参照関係 ・メソッドとフィールドの参照関係 ・メソッド内の分岐・繰り返しの数 など D B A F E C G CKメトリクス計測
STEP2:リファクタリング箇所とリファクタリングパターンの入力STEP2:リファクタリング箇所とリファクタリングパターンの入力 • リファクタリングしたい箇所(フィールド,メソッド,クラス)を指定し,適用したいリファクタリングパターンを与える • 実装しているリファクタリングパターン • フィールドの移動 • フィールドの引き上げ • フィールドの引き下げ • メソッドの移動 • メソッドの引き上げ • メソッドの引き下げ • クラスの抽出 • スーパークラスの抽出 • サブクラスの抽出
STEP3:解析情報の修正(1) • STEP2を元に解析情報を修正する • 例:クラスAのメソッドa1()をクラスBへ移動 (1)リファクタリングの影響を受けるクラスを検出する (2)ユーザ非依存部分の修正 (3)ユーザ依存部分の修正 D B d1( ) call a1( ) b1( ) call a1( ) A a1( )a2( ) C c1( ) call a1( )
D D B B d1( ) d1( ) call a1( ) call a1( ) b1( ) a1()b1() call a1( ) A A a1( )a2( ) a2( ) C C c1( ) c1( ) call a1( ) call a1( ) STEP3:解析情報の修正(2) • STEP2を元に解析情報を修正する • 例:クラスAのメソッドa1をクラスBへ移動 (1)リファクタリングの影響を受けるクラスを検出する (2)ユーザ非依存部分の修正 (3)ユーザ依存部分の修正 a1() ~ (ClassB)a1() ~ a1()
STEP3:解析情報の修正(3) • STEP2を元に解析情報を修正する • 例:クラスAのメソッドA1をクラスBへ移動 (1)リファクタリングの影響を受けるクラスを検出する (2)ユーザ非依存部分の修正 (3)ユーザ依存部分の修正 D B call a1( ) d1( ) a1()b1() ~ A (ClassB)???.a1() call a1( ) a2( ) C ~ c1( ) どのインスタンスに対して呼び出すのか?
変化があったクラスのCKメトリクス WMC CBO ・・・ DIT A’ xx xx ・・・ xx D’ B B’ B’ xx xx ・・・ xx D’ xx xx ・・・ xx F’ xx xx ・・・ xx 合計 xx xx ・・・ xx A A’ F F’ STEP4:CKメトリクスの計算 • 修正後の解析情報を元にCKメトリクスを計測 • CKメトリクスの変化があったクラスに対し,メトリクスの変化率を計算 ソフトウェアを構成するクラス群 D B A F 変化率 xx xx ・・・ xx E WMCの変化率=SUMWMC(A’, B’, D’, F’)- SUMWMC(A, B, D, F)SUMWMC(A, B, D, F) C G
提案手法の実装 • 提案手法の有用性を確認するために手法の実装,適用実験を行う • 実装 • 開発言語:Java • 実験対象:Java • 構成 • プログラム解析部(Class Construction Kit[6]) • CKメトリクス計算部(ckjm[7]) • 結果出力部 • 適用実験の対象 • Feature Location Visualizer[8](以下,FLV) • クラス数:37 • 行数:4815行 [6]Class Construction Kit, http://bcel.sourceforge.net/cck.html [7]ckjm. http://www.spinellis.gr/sw/ckjm/ [8]檜皮祐希,松下誠,井上克郎,更新履歴情報と静的情報を用いて同一機能を実装しているクラス群を抽出する手法の提案,電子情報通信学会技術研究報告, SS2006-67, Vol.106, No.427, pp.13-18, 2006.
GUI BP GVP FLGVV CL ExtractPanel ep; CP setExtractPanel()setStartClass() 適用実験の概要 • 問題点 • GUIの処理と無関係なComponentList(CL)クラスにGUIの処理の一部が実装されている • 改善案 • そのフィールドとメソッドを以下のいずれかのクラスに移動する • case1: FeatureLocationGraphVisualizationViewer(FLGVV)クラス • case2: BirdPanel(BP)クラス • case3: ComponentPanel(CP)クラス • case4: GraphViewPanel(GVP)クラス
「フィールド,メソッドの移動」は,継承の変化を伴わないのでNOC,DITは変化しない「フィールド,メソッドの移動」は,継承の変化を伴わないのでNOC,DITは変化しない LCOMは,getter/setterは省いて計測する仕様を採用したため,値に変化がなかった. WMC,CBO,RFCは変化が見られた. WMC:変化なし CBO:減少 RFC:微量な変化 適用実験の結果(1)
適用実験の結果(2) • 変化率をクラス数で正規化し,case1~4を比較. • WMCは変化なし • RFCは微量な変化 • case1 • リファクタリング後のCBOの値は減少し,一番良い結果が得られた. • case2,3,4 • リファクタリング後のCBOは増加してしまった.
考察 • 開発者の主観でリファクタリングを行うと,case2,3,4のようにソフトウェアが構造的に悪化する危険があるため,本手法を用いて比較することは重要 • 本手法では,リファクタリング前後のメトリクスの値だけでリファクタリングを評価しているが,より正確に評価するためには,ソースコード修正にかかるコストやテストにかかるコストも考慮するべき
まとめ • まとめ • リファクタリングがソフトウェア保守に与える効果を予測する手法を提案した. • その手法の適用実験を行い,有用性を評価した. • 複数のリファクタリング候補を与え,それらの評価の比較を行った. • 今後の課題 • 「クラスのインライン化」など,構造的な変化を伴う未実装なリファクタリングに関しても実装したい • ソースコード修正にかかるコスト,テストにかかるコストを考慮し,手法を改良したい