コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現 大阪大学 吉田昌友,吉田則裕,井上克郎 2008/03/13 情報処理学会第70回全国大会 1 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 概要 デザインパターンの適用を支援する手法の提案 Factory Methodパターンの適用候補を検出する 手法の提案と実現 オープンソースソフトウェアを対象とした適用実験 2008/03/13 情報処理学会第70回全国大会 2 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University デザインパターン ソフトウェアの設計において頻繁に発生する問題に対する洗 練された解決策[1] デザインパターン記述の構成要素[1] ► パターン名 デザインパターンを識別するための名前 ► 問題 デザインパターンを適用すべきコンテキスト ► 解法 設計の要素の役割や関連についての記述 ► 結果 デザインパターンを使用する場合の結果やトレードオフ [1] E. Gamma, et al., Design Patterns: Elements of Reusable Object-Oriented Software, Addition Wesley, 1995. 2008/03/13 情報処理学会第70回全国大会 3 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University Factory Methodパターン 同じインタフェースで異なる処理をするオブジェクト コンストラクタの呼び出し文が異なり拡張しにくい Creator Factory Method 生成 createProduct : Product Product 少ない修正で子クラスを追加可能 ConcreteCreator1 ConcreteCreator2 createProduct : Product createProduct : Product ConcreteProduct1 ConcreteProduct2 new new 生成 ConcreteProduct1(...) ConcreteProduct2(...) return new ConcreteProduct1(...) コンストラクタ名に依存したコードが増える return new ConcreteProduct2(...) 2008/03/13 生成 情報処理学会第70回全国大会 4 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 既存のソフトウェアに対するデザインパターンの適用 手順1. 書籍等に掲載されている適用条件に合う部分を,開発者が見 つけ出す 手順2. デザインパターンを適用した結果,設計が改善するか開発者が 検討するソフトウェアが大規模になるほど 開発者の負担は増加する 手順3.書籍等に掲載されている手順に従い,開発者がソースコードを 修正する 適用条件を満たす ソフトウェア デザインパターン についての書籍等 発見 実際に修正 検討 適用後の ソフトウェア 開発者 2008/03/13 情報処理学会第70回全国大会 5 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 既存のソフトウェアに対する Factory Methodパターンの適用例 DOMBuilderとXMLBuilderには共通のインタフェース(OutputBuilder)が存在する 新たにテストを行うクラスを追加する Factory Methodパターン適用前 •拡張性の向上 Factory Methodパターン適用後 • 拡張性の問題 junit::framework::TestCase • 子クラス追加に手間がかかる AbstractBuilderTest junit::framework::TestCase #builder: OutputBuilder ・・・ DOMBuilderTest XMLBuilderTest testAddAboveRoot testAddAboveRoot testAddAboveRoot builder = createBuilder(...); ・・・ HTMLBuilderTest createBuilder ・・・ junit::framework::TestCase protected abstract testAddAboveRoot builder = createBuilder(...); OutputBuilder createBuilder (...); ・・・ DOMBuilderTest HTMLBuilderTest コードクローン ・・・ ・・・builder = new DOMBuilder(…); ・・・ = new DOMBuilder(…); builder ・・・ createBuilder ・・・ builder = new HTMLBuilder(…);testAddAboveRoot testAddAboveRoot ・・・ ・・・ builder = new XMLBuilder(…); createBuilder createBuilder ・・・ ・・・ builder = new XMLBuilder(…); return new HTMLBuilder(…); ・・・ 2008/03/13 XMLBuilderTest return new DOMBuilder(…); return new XMLBuilder(…); 情報処理学会第70回全国大会 6 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 本研究の動機と目的 デザインパターン適用の問題点 ►デザインパターンの適用条件に合うソースコードを人手で 発見することは困難である ►大規模ソフトウェアが対象の場合,より困難となる Factory Methodパターンの適用条件に合う部分を 自動的に検出する手法の実現 ►コードクローンの解析 ►クラスの継承関係の抽出 2008/03/13 情報処理学会第70回全国大会 7 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 提案手法:適用条件に合う部分を検出 Factory Methodパターン適用前 条件 1 兄弟クラス間にメソッド単位のコードクローンが 存在する junit::framework::TestCase 手順 1 DOMBuilderTest XMLBuilderTest testAddAboveRoot testAddAboveRoot コードクローンを検出し,コードクローンを 含むクラスの継承関係を解析する 条件 2 ・・・ builder = new DOMBuilder(…); ・・・ ・・・ builder = new XMLBuilder(…); ・・・ 2008/03/13 コンストラクタ呼び出し文がメソッド間で異 なる 手順 2 メソッド中のコンストラクタ呼び出し文を 比較する 情報処理学会第70回全国大会 8 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 実験用ツールの概要 入力 ► Javaで記述されたソースコードファイル群 出力 ► Factory Methodパターンの適用条件に合うメソッド群の位置 ► それらメソッドに共通した親クラス名 コードクローンの検出にはCCFinder[2]を用いた ソースコード 解析部 解析部 入力 ソースコード クラス継承関係 コンストラクタ呼出文の特 定 出力 コードクローン 検出部 デザインパターンが 適用可能な部分の 位置情報 コードクローン の 位置情報 code clone detection system for [2] T. Kamiya, et al., “CCFinder: A multi-linguistic token-based large scale source code”, IEEE Trans. Softw. Eng., 28(7):654-670, 2002. 2008/03/13 情報処理学会第70回全国大会 9 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 実験概要 1. Factory Methodパターンの適用条件に合う部分 の数の調査 2. 検出した部分の2例に対し実際にFactory Methodパターンが適用可能か確認 2008/03/13 情報処理学会第70回全国大会 10 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University ツールが検出した部分の数 数万から数十万行のソフトウェア9つから最多で14個検出された ソフトウェア ソースコードの行数 クラスの数 Ant ANTLR 198K 32K 994 167 2 1 Azureus JBoss jEdit JHotDraw 538K 679K 168K 90K 2226 3372 922 487 14 10 0 1 SableCC Soot 35K 352K 237 2298 1 9 WALA 210K 1565 6 2008/03/13 検出部分の数 情報処理学会第70回全国大会 11 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University ANTLRへの適用 Factory Methodパターン適用前 Factory Methodパターン適用後 CodeGenerator CodeGenerator createActionLexer processAction ForSpecialSymbols protected abstract OOActionLexer createActionLexer(...); ・・・ lexer = createActionLexer(…); ・・・ 83個のテストケースを用いて,適用前後で 振る舞いが変化していないことを確認できた 共通のインタフェースが存在しないので 新たにOOActionLexerインタフェースを定義 ツールが提示した部分に対して ・・・ ・・・ ・・・ lexer = new csharp. lexer = new cpp. lexer = new java. Factory Methodパターンを適用できた CSharpCodeGenerator CppCodeGenerator JavaCodeGenerator CSharpCodeGenerator CppCodeGenerator JavaCodeGenerator processAction ForSpecialSymbols processAction ForSpecialSymbols processAction ForSpecialSymbols createActionLexer createActionLexer createActionLexer ・・・ lexer = new csharp. ActionLexer(…); ・・・ ・・・ lexer = new cpp. ActionLexer(…); ・・・ ActionLexer(…); ・・・ 2008/03/13 ・・・ lexer = new java. ActionLexer(…); ・・・ return new ActionLexer(…); csharp. ActionLexer(...); ・・・ return new return new cpp. java. ActionLexer(…); ActionLexer(...); ActionLexer(...); ・・・ 情報処理学会第70回全国大会 12 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University Antへの適用 Factory Methodパターン適用前 Factory Methodパターン適用中 BaseParamFilterReader BaseParamFilterReader getLines 振る舞いに変化がないことを確認するために JUnitのテストケースを修正する必要がある HeadFilter TailFilter getLines getLines chain chain newFilter = new HeadFilter(…); ・・・ getLines() HeadFilter TailFilter chain chain newFilter = new TailFilter(…); ・・・ getLines() 2008/03/13 情報処理学会第70回全国大会 13 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 考察 Antへの適用 ►JUnitのテストケースを修正する必要が生じた ANTLRへの適用 ►インタフェースを追加する必要が生じた ►コードクローンの量を減らすことができた ツールの出力情報の不足 ►デザインパターンを適用することで影響を受けるクラス等 ►テストケースを修正する必要性の有無 2008/03/13 情報処理学会第70回全国大会 14 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University まとめと今後の課題 まとめ ► Factory Methodパターンの適用条件に合う部分を自動的に検出 する手法の提案 ► 適用実験でオープンソースソフトウェアから適用候補を検出 2個の検出結果については,実際に適用可能であることを確認 今後の課題 ► ツールが出力する情報を改善した更なる適用支援 デザインパターンを適用することで影響を受ける部分 テストケースを修正する必要性の有無 ► Factory Methodパターン以外のデザインパターンについて適用候 補を検出 2008/03/13 情報処理学会第70回全国大会 15 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 2008/03/13 情報処理学会第70回全国大会 16 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
© Copyright 2024 ExpyDoc