Document

コードクローン検出に基づくデザイン
パターン適用支援手法の提案と実現
大阪大学
吉田昌友,吉田則裕,井上克郎
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