コーディングパターン - Osaka University

Download Report

Transcript コーディングパターン - Osaka University

コーディングパターンの分類に用いる
ソフトウェアメトリクスの検討
大阪大学 大学院情報科学研究科
○ 伊達 浩典
三宅 達也
石尾 隆
井上 克郎
Department of Computer Science,
Graduate School of Information Science & Technology,
Osaka University
目次
• コーディングパターン
– 種類
• イディオム
• アプリケーション固有の機能実装
– 重要なパターンの特徴
• 分類に利用するメトリクス
– パターンの密度
– パターンの分散
– パターン要素の非繰り返しの割合
• まとめと今後の課題
平成20年度 情報処理学会 関西支部 支部大会
2008/10/24
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
2
コーディングパターン
コーディングパターンとは
・ 頻出する定型的なコード片
・ メソッド呼び出し,制御構造要素の列
while (iter.hasNext()) {
Item item = (Item)iter.next();
buf.append(item.toString());
}
コピー
&
ペースト
イディオム
の再利用
while (iter.hasNext()) {
Item item = (Item)iter.next();
buf.append(item.toString());
}
while (iter.hasNext()) {
Data data = (Data)iter.next();
buf.append(process(data));
buf.append(data.toString());
}
平成20年度 情報処理学会 関西支部 支部大会
2008/10/24
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
3
コーディングパターンの種類
• イディオム
– プログラム実装上の定形処理
– 実装に利用する言語やライブラリに依存
• アプリケーション固有の機能実装
– アプリケーション中で特定の機能を実装する為に
用意した枠組み
平成20年度 情報処理学会 関西支部 支部大会
2008/10/24
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
4
コーディングパターン例
イテレータ
Collection.iterator()
Iterator.hasNext()
LOOP
Iterator.next()
Iterator.hasNext()
END-LOOP
コーディングパターン
~ イディオム ~
…
Iterator it = list.iterator();
while( it.hasNext() ) {
Item item = (Item)it.next();
if (item.isActive()) {
item.deactivate();
}
}
…
…
for( Iterator it = list.iterator(); it.hasNext(); ) {
Item item = (Item)it.next();
if (item.isActive()) {
item.deactivate();
ソースコード
}
}
…
インスタンス
2008/10/24
平成20年度 情報処理学会 関西支部 支部大会
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
5
コーディングパターン例
~ アプリケーション固有の機能実装 ~
Undo機能の実装
JHotDraw(Ver. 5.4b1)
createUndoActivity()
setUndoActivity()
getUndoActivity()
setAffectedFigures()
コーディングパターン
public void reverseAction(Figure figure) {
setUndoActivity(createUndoActivity());
List l = CollectionsFactory.current().createList();
l.add(figure);
l.add(((DecoratorFigure)figure).peelDecoration());
getUndoActivity().setAffectedFigures(
new FigureEnumerator(l));
((BorderTool.UndoActivity)getUndoActivity())
.replaceAffectedFigures();
}
public void execute() {
super.execute();
setUndoActivity(createUndoActivity());
getUndoActivity()
.setAffectedFigures(view().selection());
FigureEnumeration fe
= getUndoActivity().getAffectedFigures();
…
}
インスタンス
平成20年度 情報処理学会 関西支部 支部大会
2008/10/24
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
6
問題点と目的
• 問題点
– 検出されるパターン数が膨大
– プログラムの理解に重要なパターンは少数
• 目的
– コーディングパターンを分類
– 重要なパターンを抽出
実験条件
• 10 ≦ sup
• 4 ≦ len
平成20年度 情報処理学会 関西支部 支部大会
2008/10/24
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
7
重要なパターンの抽出
• インスタンス数が多いパターン
– 影響を受けるメソッドが多いため,注意が必要
⇒ マイニングのサポート値で対応
• ソースコード上で形が類似したパターン
– パターン中に余計な要素が含まれない
⇒ DEN(DENsity)
• プログラムの特定パッケージやサブシステムにのみ
登場するパターン
– プログラムの機能を実装に関連する
⇒ RAD(RADius)
• 同一の構造の繰り返しではないパターン
– 不可分なパターンを見つけたい
⇒ RNR(Ratio of Non-Repeated elements)
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
コーディングパターンのメトリクス
• DEN(DENsity)
– パターンインスタンスの密度(パターン部分とパ
ターン以外の部分の割合)の平均
• RAD(RADius)
– パターンインスタンス間のパッケージ階層上での
分散度合
• RNR(Ratio of Non-Repeated elements)
– パターン内の非繰り返し要素の割合
平成20年度 情報処理学会 関西支部 支部大会
2008/10/24
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
9
DEN(DENsity)
LOOP
a()
b()
END-LOOP
LENpat
• パターンインスタンスの密度
(DENinst)の平均
コーディングパターン
v()
LOOP
a()
b()
w()
x()
END-LOOP
y()
z()
インスタンス
DENinst = LENpat / LENinst
DENinst = 4 / 6
– LENpat
LENinst
• コーディングパターンの要素数
– LENinst
• インスタンス開始要素から,
インスタンス終了要素までの要素数
平成20年度 情報処理学会 関西支部 支部大会
2008/10/24
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
10
RAD(RADius)
• パターンインスタンスのパッケージ間の分散
度合
RAD = 0
RAD = 1
RAD = 2
pkg
pkg
2
1
0
pkg
ファイルA
ファイルC
ファイルA
ファイルB
ファイルA ファイルB
パターンインスタンス
平成20年度 情報処理学会 関西支部 支部大会
2008/10/24
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
11
RNR(Ratio of Non-Repeated elements)
• コーディングパターン中の非繰り返し要素の割合
x()
a()
b()
a()
b()
a()
b()
y()
z()
• RNR
= 1 – (繰り返し要素数 / 全要素数)
= 1 – (4 / 9)
=5/9
コーディングパターン
平成20年度 情報処理学会 関西支部 支部大会
2008/10/24
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
12
まとめと今後の課題
• まとめ
– 重要なパターンを抽出
• インスタンス数が多いパターン
• ソースコード上で形が類似したパターン
• プログラムの特定パッケージやサブシステムにのみ登場するパタ
ーン
• 同一の構造の繰り返しではないパターン
– メトリクス
• DEN(DENsity)
• RAD(RADius)
• RNR(Ratio of Non-Repeated elements)
• 今後の課題
– メトリクス計測ツールの実装
– 評価実験
平成20年度 情報処理学会 関西支部 支部大会
2008/10/24
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
13