スライド 1 - Software Engineering Laboratory

デザインパターンの適用事例
に対するプログラムの安定性
の調査
井上研究室
齋藤 晃
2009/2/23
特別研究発表会
1
背景:デザインパターンの重要性
デザインパターンとは

オブジェクト指向設計に関する典型的な問題の解決策
 クラスの保守性が向上


熟練者が過去に蓄積したノウハウ
Gammaらの提案した23個のパターンが有名[1]
Template Methodパターン

デザインパターンの1例
 多くの既存コードで使用されており,ソースコードから検出も
比較的容易
 他のパターンの一部としてよく使われている
特別研究発表会
[1] E .Gamma, R. Helm, R. Johnson, and J. M. Vlissides. Elements of Reusable Object-Oriented Software. Addison Wesley, 1995.
2009/2/23
2
Template Methodパターン
親クラスのあるメソッド内で抽象メソッドを呼ぶ
Figure
abstract draw(Graphics g)
drawFigure()
抽象メソッド
・・・・・・・・・・・
void drawFigure(){
g.cleargraphics();
draw(g);
・・・
}
1つ以上のクラスが継承
Circle
Rectangle
Triangle
draw(Graphics g)
draw(Graphics g)
draw(Graphics g)
抽象メソッドをオーバーライド
クラス追加
Figure
Figure
Figure
Figure
f1
f1
f2
f2
==
==
new
new
new
new
Circle();
Circle();
Rectangle();
Rectangle();
Figure f3 = new Triangle();
f1.drawFigure();
f2.drawFigure();
f1.drawFigure();
f2.drawFigure();
異なる処理を
f3.drawFigure();
共通のインターフェースで動作
変更範囲を限定することで保守性が向上
特別研究発表会
2009/2/23
3
問題点(1/2)

Template Methodパターンの適用事例の中には,安定性が
低いものが存在

安定性が低い…ソフトウェア保守において多くのクラスに変更が生じる
・・・・・
Version1.0
Version1.1
Version1.2
1つだけ変更
Version1.3
・・・・・
Version1.0

Version1.2
Version1.1
複数のクラス
が変更
Version1.3
多くのクラスに同時に変更が生じるのは望ましくない
特別研究発表会
2009/2/23
4
問題点(2/2) –同時変更の例
関連するクラス全てを同時に変更する必要がある
Figure
変
更
abstract draw(Graphics g)
drawFigure()
abstract draw()
drawFigure()
Circle
Rectangle
Triangle
draw(Graphics g)
draw(Graphics g)
draw(Graphics g)
変更
変更
変更

Figure
Circle
Rectangle
Triangle
draw()
draw()
draw()
パターンの適用により同時変更が生じる
特別研究発表会
2009/2/23
5
研究内容
デザインパターンの安定性を低下させる要因を調査
安定性が低い‥同時変更が生じやすい
安定性を低下させる要因は何か?
仮説1:子クラスの処理内容の差異が大きいほど
同時変更が生じやすい
ここだけ説明
仮説2:子クラスの処理内容の規模が大きいほど
同時変更が生じやすい
仮説1を設定した理由

差異が大きいと子クラスごとに処理を切り替えることが
難しくなり,親クラスに変更が波及する

同時変更が起こりやすくなる
特別研究発表会
6
仮説1の検証方法
仮説1
子クラスの処理内容に差異が大きいほど変更されやすい
検証方法
クラスの処理差異を表すメトリクスを定義し,計測
 計測したメトリクスの値が,同時変更に関係があるか
どうかを調査

対象とする同時変更
抽象メソッドのメソッド定義の変更
 抽象メソッドの数の変更
 Template Methodの消滅

特別研究発表会
2009/2/23
7
調査する変更



抽象メソッドのメソッド定義の変更
抽象メソッドの数の変更
Template Methodの消滅
これらの変更の有無を
調査
SuperClass
SuperClass
templateMethod()
primitiveOperation()
templateMethod()
anotherMethod()
primitiveOperation()
primitiveOperation(int)
primitiveOperation2()
SubClass1
SubClass2
primitiveOperation()
primitiveOperation()
SubClass2
SubClass1
primitiveOperation()
primitiveOperation()
primitiveOperation(int)
Operation1()
primitiveOperation(int)
Operation()
primitiveOperation2() primitiveOperation2()
変更前
変更後
特別研究発表会
2009/2/23
8
計測するメトリクス

ここだけ説明
型名類似度SimT
 メソッド内で利用された型名に着目

識別子名類似度SimⅠ
 メソッド内で利用された型名を除く識別子名に着目

LOC分散LOCv
 メソッド内のLOC(コード行数)の分散
特別研究発表会
2009/2/23
9
型名類似度SimT
メソッド内の一時変数・参照変数の型名と呼び出される
メソッドの引数・戻り値の型名の一致割合
Scanner1クラスのnewScannerメソッド
protected Scanner newScanner() {
ZipScanner zs = new ZipScanner();
zs.setEncoding(encoding);
defaultEncoding = false; String
return zs;
boolean
}
Scanner2クラスのnewScannerメソッド
AbstractScanner
templateMethod
abstract newScanner()
T1 = {boolean, String, ZipScanner}
T2 = {boolean, TarScanner}
Scanner1
メトリクス値
Scanner2
n
 Ti
protected Scanner newScanner() {
TarScanner zs = new TarScanner();
defaultEncoding = false;
return zs;
boolean
}
newScanner()
newScanner()
SimT = i n1 = 0.25
抽象メソッドをオーバーライド
メトリクス計測対象となるメソッド
 Ti
特別研究発表会
i 1
2009/2/23
10
識別子名類似度SimⅠ
メソッド内の一時変数・参照変数の識別子名と呼び出されている
メソッド名の一致割合(ただし型名は除く)
Scanner1クラスのnewScannerメソッド
protected Scanner newScanner() {
ZipScanner zs = new ZipScanner();
zs.setEncoding(encoding);
defaultEncoding = false;
return zs;
}
Scanner2クラスのnewScannerメソッド
Ⅰ1 = {defaultEncoding, zs,
encoding, setEncoding}
Ⅰ2 = {defaultEncoding, zs}
メトリクス値
protected Scanner newScanner() {
TarScanner zs = new TarScanner();
defaultEncoding = false;
return zs;
}
n
I
SimⅠ =
特別研究発表会
i
i 1
n
I
i 1
= 0.5
i
2009/2/23
11
変更の検出およびメトリクス計測の流れ
ソースコード ソースコード ソースコード
バージョン1.0 バージョン1.1 バージョン1.2
バイトコード
バージョン1.0
バイトコード
バイトコード
バージョン1.1 バージョン1.2
入力:Javaソースコード
:Javaバイトコード
1.Template Methodパターン検出
デザインパターン
検出ツール[2]
メソッド名,クラス位
置などの情報を取得
調査ツール
メトリクス
計測ツール
分類処理部
2.変更の有無による
分類
分類データ
変更有
パターン
変更無
パターン
3.メトリクス計測
4.変更の有無とメトリクス値の関係を評価
出力:メトリクス値
特別研究発表会
[2]Nikolaos Tsantalis,Design pattern detection using similarity scoring. IEEE Transactions on Software Engineering, 2006
2009/2/23
12
メトリクス計測結果

調査対象:オープンソースソフトウェア8個

Ant, ANTLR, ArgoUML, FindBugs, JFreeChart, JRefactory, JHotDraw, Log4j
 変更なし:272個,変更あり:68個
第3四分位
型名類似度
類似度
識別子名類似度
類似度
中央値
第1四分位
変更なし
変更あり
変更なし
変更あり
同時変更が生じたパターンの適用事例ほうが類似度が低い傾向
 マン・ホイットニーのU検定で有意差
 型名類似度:P=0.0014, 識別子名類似度:P=0.0053

特別研究発表会
2009/2/23
13
結果の分析

提案した類似度が低く,変更が生じた例
FigCallAction::layoutActivations SimⅠ = 0.0, SimT = 0.0
protected void layoutActivations() {
if (!getSrcFigObject().hasActivations()) {
getSrcFigObject().makeActivation(
getSrcFigObject().getObjectNode(),
(Node) getSrcLinkPort());
・・・
} else { ・・・
処理を記述
}
}
FigCallAction::layoutActions
FigLink
layoutEdge
abstract layoutActivations
FigCallAction
FigReturnAction
layoutActivations
layoutActivations
protected void layoutActivations(){
//TODO: Auto-generated method stub
}
処理を記述していない

次のバージョンでTemplate Methodが消滅
特別研究発表会
処理内容の差異が原因で,Template
Methodが消滅
2009/2/23
14
まとめと今後の課題
まとめ



Template Methodパターンの適用事例の安定性を低下させる
要因を調査
識別子名類似度・型名類似度の安定性との関係
マン・ホイットニーのU検定で有意差
今後の課題



他のパターンへの適用
同時変更が生じやすい適用事例を自動的に特定
安定性の低い適用事例が実装されたら警告する機能を統合
開発環境に実現
特別研究発表会
2009/2/23
15
ご静聴ありがとうございました
2009/2/23
特別研究発表会
16
質疑応答
特別研究発表会
2009/2/23
17
検定について

得られたデータは正規分布とは言えなかった
 両側に値が寄っているため
 コルモゴロフ-スミルノフ検定(KS検定)で確認

マン・ホイットニーのU検定
 ノンパラメトリック検定の1つ
 順位和による差異を検定
帰無仮説:2群の代表値に差がない(代表値R1= R2:)
対立仮説:2群の代表値に差がある(代表値R1< R2:片側検定)
特別研究発表会
2009/2/23
18
仮説2について
仮説2:子クラスの処理内容の規模が大きいほど変更
されやすい
LOC平均
 LOC平均を計測


U検定で有意差なし
(P= 0.139)

処理内容の規模と同時変更の
差異に相関は見られなかった
平均
LOC
変更なし
特別研究発表会
変更あり
2009/2/23
19
LOC分散について

子クラスの抽象メソッドの差異を計測
対数(標準偏差)で表示
類似度
変更なし

変更あり
U検定でP値0.0467
特別研究発表会
2009/2/23
20
計測したメトリクス値(1/2)
LOC平均
LOC分散
特別研究発表会
2009/2/23
21
計測したメトリクス値(2/2)
識別子類似度
型名類似度
特別研究発表会
2009/2/23
22
変更結果の例

子クラスの処理差異が変更の要因となっているか?
SubClass1 SimⅠ = 0.0, SimT = 0.0
protected boolean isValidElement(MBase o){
return o instanceof MAssociationRole …
}
SubClass2
protected boolean isValidElement(MBase elem){
return elem instanceof MAssociation …
}
引数がObjectに変化
処理差異が変更の要因になっている
特別研究発表会
2009/2/23
23
計測したメトリクスについて

型名類似度と識別子名類似度の相関
 相関係数0.567
 変更なし:0.511
 変更あり:0.803
LOC分散

U検定でP値0.0467
 危険率5%で有意差
変更なし
変更あり
250
60
200
50
40
150
30
100
20
50
10
0
0
0
5 10 15 20 25 30 35 40 45 50 55
特別研究発表会
0
5 10 15 20 25 30 35 40 45 50 55 60
2009/2/23
25
LOC平均

U検定でP値0.1392
変更あり
変更なし
50
45
40
35
30
25
20
15
10
5
0
250
200
150
100
50
0
0
10 20 30 40 50 60 70 80 90 100 110
特別研究発表会
0
10
20
30
40
50
60
70
80
90
2009/2/23
26
識別子名類似度

U検定で有意差(P=0.0053)
変更が生じなかったパターン数
変更が生じたパターン数
120
120
100
100
80
パターン
60
数
40
パターン
数
80
60
40
20
20
0
0
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
識別子類似度
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
識別子類似度
型名類似度

U検定で有意差(P=0.0014)
変更が生じなかったパターン数
80
70
60
50
パターン
40
数
30
20
10
0
変更が生じたパターン数
80
70
60
50
パターン
40
数
30
20
10
0
0
0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
型名類似度
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
型名類似度
計測するメトリクス(1/2)
子クラスのLOC平均LOCa
 子クラスのLOC分散LOCv
 識別子類似度SimⅠ

 メソッド内で定義される一時変数・参照変数の識
別子名と呼び出されている関数名の一致割合

型名類似度SimT
 メソッド内で定義される一時変数・参照変数の型
名と呼び出される関数の引数・戻り値の型の一
致割合
特別研究発表会
2009/2/23
29