機能的関心事を抽出するためのプログラムスライシング

メソッド呼び出しパターンとして現れる
横断的関心事の特徴評価
井上研究室
B4 三宅達也
Department of Computer Science,
Graduate School of Information Science & Technology,
Osaka University
研究背景
アスペクト指向プログラミング(AOP)
 横断的関心事
 メソッド呼び出しパターン

卒業論文発表会
2007/02/27
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
2
研究背景
~アスペクト指向プログラミング(AOP)~
新たなモジュール単位「アスペクト」を導入
 アスペクトを利用し、より理想的なモジュール構
造を実現
 保守性、再利用性などが向上

クラス1
クラス2
アスペクト
例外処理
卒業論文発表会
ロギング
2007/02/27
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
3
研究背景 ~横断的関心事~
複数のモジュールにまたがって実装される
機能
 保守性,再利用性などを悪化させる

クラス1
クラス2
ロギング
ロギング
例外処理
例外処理
ロギング
例外処理
卒業論文発表会
2007/02/27
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
4
横断的関心事の例
Class cls1 {
void method1 ( ) {
logging.message();
logging.message(
“meth1”);
}
Class Logging {
public void message(String
){
s) {
System.out.println(“start”);
System.out.println(s);
}
・
・
・
コンパイル
エラー
}
}
メソッドの開始時に
メッセージを
表示するメソッド
Class cls2 {
void method2 ( ) {
logging.message();
logging.message(
“meth2”);
}
}
・
・
・
本来はLoggingクラス
にまとめてしまいたい
卒業論文発表会
2007/02/27
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
5
研究背景 ~横断的関心事~
複数のモジュールにまたがって実装される
機能
 保守性,再利用性などを悪化させる

クラス1
クラス2
ロギング
ロギング
例外処理
例外処理
ロギング
アスペクト
例外処理
アスペクト
ロギング
例外処理
卒業論文発表会
2007/02/27
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
6
研究背景 ~メソッド呼び出しパターン~
ソースコードに頻繁に出現する構造のよく似た
コード記述
 特定の機能を実現するメソッド群は出現順序が
決まっている


以下の情報を含んでいる
 実現したい処理に必要な関数群
 関連のある関数の呼び出し順
 関数の引数や返り値の扱い方
卒業論文発表会
2007/02/27
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
7
メソッド呼び出しパターンの例
Public void circle ( ) {
Public void triangle ( ) {
辺の長さを
double res;
double res;
読み込む
LineData ld = input ( );
LineData ld = input ( );
boolean c = ld.check( );
boolean c = ld.check( );
長さの例外
if ( c ) {
チェック
int h = ld.getHeight( );
int r = ld.getRadius( );
int b = ld.hetBottom( );
求めた面積
res = Math.pow ( r,2 );
if ( c ) {
を出力
res = res * Math.PI;
res = b * h / 2;
output ( res );
output ( res );
}
メソッド呼び出しパターン }
}
}
input( )
LineData.check( );
if
output;
}
卒業論文発表会
2007/02/27
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
8
本研究の目的

注目した特長
 横断的関心事
 特定の機能に関するコードが複数個所に分散
 メソッド呼び出しパターン
 複数個所に存在する同種の機能を実現するコードに出現

目的
 横断的関心事とメソッド呼び出しパターンの関連性
を調査する
卒業論文発表会
2007/02/27
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
9
メソッド呼び出しパターン抽出

既存の手法を採用[1]
 ソースコードの特徴抽出
 特徴シーケンスの生成
 Sequential


pattern mining
PrefixSpanアルゴリズムを採用
Javaで書かれたプログラムを対象としたツールを実装
[1] 中山崇,松下誠,井上克郎, ”ソースコードの差分を用いた関数呼び出しパターン抽
出法の提
案”,情報処理学会研究報告,Vol.2006,No.35,2006-SE-151,pp.49–56,2006
卒業論文発表会
2007/02/27
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
10
実験概要

実験対象

JHotDraw



図形描画アプリケーション
総行数 : 約18000行
抽出したパターン
出現回数 : 4回以上
 パターン数 : 49種類
 抽出時間 : 11秒


評価方法

抽出したパターンが横断的関心事と関連しているかどうかを評価


他の文献でアスペクト化すべきであるとされている横断的関心事を参考に評価
評価基準



パターンの長さ
パターンの出現回数
パターンが出現するクラス数
卒業論文発表会
2007/02/27
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
11
調査結果

機能に関連したパターン
 27パターン



横断的であるパターン : 24パターン
横断的でないパターン : 3パターン
機能に関連していないパターン
 22パターン
卒業論文発表会
2007/02/27
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
12
抽出されたメソッド呼び出しパターンの例
(機能に関連しているパターン)
実行コマンド取り消しのための情
報を保存するためのパターン
(アスペクト候補)
org.jhotdraw.standard.SendToBackCommand
コマンド実行
public void execute() {
super.execute();
setUndoActivity(createUndoActivity());
getUndoActivity().setAffectedFigures(view().selectionZOrdered());
FigureEnumeration fe = getUndoActivity().getAffectedFigures();
while (fe.hasNextFigure()) {
view().drawing().sendToBack(fe.nextFigure());
}
view().checkDamage();
}
実行コマンド取り消しの
ための情報を保存
org.jhotdraw.standard. PasteCommand
実行コマンドの処理
public void execute() {
super.execute();
Point lastClick = view().lastClick();
FigureSelection selection = (FigureSelection)Clipboard.getClipboard().getConten;
if (selection != null) {
setUndoActivity(createUndoActivity());
getUndoActivity().setAffectedFigures(
(FigureEnumerator)selection.getData(StandardFigureSelection.TYPE));
if (!getUndoActivity().getAffectedFigures().hasNextFigure()) {
setUndoActivity(null);
return;
}
実行コマンドがビューに
与えた影響をチェック
Rectangle r = getBounds(getUndoActivity().getAffectedFigures());
view().clearSelection();
メソッド呼び出しパターン
AbstractCommand.execute()
AbstractCommand.setUndoActivity()
AbstractCommand.getUndoActivity()
Undoable.setAffectedFigures()
AbstractCommand.getUndoActivity()
Undoable.getAffectedFigures()
FigureEnumeration.hasNextFigure()
AbstractCommand.view()
DrawingView.checkDamage()
FigureEnumeration fe = insertFigures(getUndoActivity().getAffectedFigures()
getUndoActivity().setAffectedFigures(fe);
view().checkDamage();
}
}
卒業論文発表会
実行コマンドがビューに与えた影
響をチェックするためのパターン
2007/02/27
(アスペクト候補)
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
13
抽出されたメソッド呼び出しパターンの例
(機能に関連していないパターン)
org.jhotdraw.standard.StandardDrawingView
public void addAll(Collection figures) {
FigureEnumeration fe = new FigureEnumerator(figures);
while (fe.hasNextFigure()) {
add(fe.nextFigure());
}
}
集合がまだ要素を
持っているかどうか
チェック
メソッド呼び出しパターン
(出現回数59)
org.jhotdraw.standard.CompositeFigure
public FigureEnumeration figures(Rectangle viewRectangle) {
if (_theQuadTree != null) {
FigureEnumeration fe =
_theQuadTree.getAllWithin(new Bounds(viewRectangle(
List l2 = CollectionsFactory.current().createList();
while (fe.hasNextFigure()) {
Figure f = fe.nextFigure();
//int z = fFigures.indexOf(f);
l2.add(new OrderedFigureElement(f, f.getZValue()));
}
・
・
}
FigureEnumeration.hasNextFigure()
while
FigureEnumeration.nextFigure()
}
集合の
次の要素を取得
卒業論文発表会
繰り返し分の制御に
関連するパターン
(アスペクトの候補
とはいい難い)
2007/02/27
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
14
調査結果

長いパターン

なんらかの機能に関連しているものが多い
パターンの長さ
9
8
7
6
5
4
機能に関連しているも
のの割合
2
2
5
1
7
10
50%
45%
機能に関連しているも
100%
のの割合

71%
33%
出現回数が多いパターン

何らかの機能に関連しているパターンと関連していないパターンが混在
出現回数
機能に関連しているもの

100%
59
0/1
26
1/1
19
0/1
15
0/1
12
1/2
11
1/2
出現するクラス数が1のパターン

横断的でないパターンを示す
卒業論文発表会
2007/02/27
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
15
結果と考察

パターン長が長いものほどアスペクトにすべき
横断的関心事に関連しているものが多い
 パターン長が長いほどパターンが出現するメソッド
の機能とパターンが実現する機能が一致する可能
性が高くなる
 同様の機能を実現しているメソッドが複数存在する
 複数の横断的関心事が同じ順序で実行されている
箇所が長いパターンとして出現する
卒業論文発表会
2007/02/27
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
16
抽出されたメソッド呼び出しパターンの例
(機能に関連しているパターン)
実行コマンド取り消しのための情
報を保存するためのパターン
(アスペクト候補)
org.jhotdraw.standard.SendToBackCommand
コマンド実行
public void execute() {
super.execute();
setUndoActivity(createUndoActivity());
getUndoActivity().setAffectedFigures(view().selectionZOrdered());
FigureEnumeration fe = getUndoActivity().getAffectedFigures();
while (fe.hasNextFigure()) {
view().drawing().sendToBack(fe.nextFigure());
}
view().checkDamage();
}
実行コマンド取り消しの
ための情報を保存
org.jhotdraw.standard. PasteCommand
実行コマンドの処理
public void execute() {
super.execute();
Point lastClick = view().lastClick();
FigureSelection selection = (FigureSelection)Clipboard.getClipboard().getConten;
if (selection != null) {
setUndoActivity(createUndoActivity());
getUndoActivity().setAffectedFigures(
(FigureEnumerator)selection.getData(StandardFigureSelection.TYPE));
if (!getUndoActivity().getAffectedFigures().hasNextFigure()) {
setUndoActivity(null);
return;
}
実行コマンドがビューに
与えた影響をチェック
Rectangle r = getBounds(getUndoActivity().getAffectedFigures());
view().clearSelection();
メソッド呼び出しパターン
AbstractCommand.execute()
AbstractCommand.setUndoActivity()
AbstractCommand.getUndoActivity()
Undoable.setAffectedFigures()
AbstractCommand.getUndoActivity()
Undoable.getAffectedFigures()
FigureEnumeration.hasNextFigure()
AbstractCommand.view()
DrawingView.checkDamage()
FigureEnumeration fe = insertFigures(getUndoActivity().getAffectedFigures()
getUndoActivity().setAffectedFigures(fe);
view().checkDamage();
}
}
卒業論文発表会
実行コマンドがビューに与えた影
響をチェックするためのパターン
2007/02/27
(アスペクト候補)
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
17
まとめと今後の課題

メソッド呼び出しパターンとアスペクトにすべき横断的
関心事の関連を調査
 パターンが長いほど横断的関心事との関連が強い
 出現回数はアスペクトを用いたコード書き換えの効果を示す
と考えられる

今後の課題
 他の対象で同じ実験を行う
 本研究で得られた実験結果はJHotDraw特有の特徴から得られた
結果である可能性がある
 本研究で得られた結果を応用し、アスペクトに関連したパ
ターンのみを抽出する手法の考案
卒業論文発表会
2007/02/27
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
18