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

メソッド呼び出しパターンとして現れる
横断的関心事の検出
大阪大学
三宅達也
Department of Computer Science,
Graduate School of Information Science & Technology,
Osaka University
研究概要

メソッド呼び出しパターン抽出手法を用いて横断的関心事を検
出


横断的関心事とメソッド呼び出しパターンは同種の機能に関するコード
が複数個所に出現するという点で類似している
横断的関心事と関連しているパターンがどの程度存在している
かの調査
メソッド呼び出し
パターン
横断的
関心事
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
2
研究背景
横断的関心事
 アスペクト指向プログラミング(AOP)
 メソッド呼び出しパターン

SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
3
横断的関心事
複数のモジュールにまたがって実装される
機能
 保守性,再利用性などを悪化させる

クラス1
クラス2
ロギング
ロギング
例外処理
例外処理
ロギング
例外処理
SIGSS研究会
2015/10/1
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クラス
にまとめてしまいたい
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
5
アスペクト指向プログラミング(AOP)
新たなモジュール単位「アスペクト」を導入
 アスペクトを利用し、より理想的なモジュール構
造を実現
 保守性、再利用性などが向上

クラス1
クラス2
アスペクト
例外処理
SIGSS研究会
ロギング
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
6
横断的関心事の種類
~ Homogeneous と Heterogeneous ~

均一性横断的関心事(homogeneous crosscutting concern)
 どの出現箇所でも関心事を実現するコードが均一


単一のメソッド呼び出し
複数のモジュールにまたがるコードクローン
 アスペクトにまとめるのが容易

非均一性横断的関心事(heterogeneous crosscutting concern)
 出現箇所ごとに関心事を実現するコードが異なる
 アスペクトにまとめるのが困難
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
7
横断的関心事の種類の例
~ Homogeneous と Heterogeneous ~
均一性横断的関心事
非均一性横断的関心事
public void heterogen1 ( ) {
double res;
LineData ld = input ( );
boolean c = ld.check( );
int h = ld.getHeight( );
int b = ld.getBottom( );
if ( c ) {
res = b * h / 2;
output ( res );
}
}
public void homogen1 ( ) {
if ( isLog() ) {
showLog ( );
}
int r = ld.getRadius( );
res = Math.pow ( r,2 );
res = res * Math.PI;
}
public void homogen2 ( ) {
if ( isLog() ) {
showLog ( );
}
int h = ld.getHeight( );
int b = ld.getBottom( );
res = b * h / 2;
}
SIGSS研究会
public void heterogen2 ( ) {
double res;
LineData ld = input ( );
Id.hoge();
boolean c = ld.check( );
if ( c ) {
int r = ld.getRadius( );
res = Math.pow ( r,2 );
res = res * Math.PI;
output ( res );
}
}
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
8
メソッド呼び出しパターン

ソースコードに頻繁に出現する構造のよく似た
メソッド呼び出し列
 特定の機能を実現する定型的なコード
 特定の制御構造を含む

以下の情報を含んでいる
 実現したい処理に必要なメソッド呼び出し群
 関連のあるメソッドの呼び出し順
 メソッドの引数や返り値の扱い方
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
9
メソッド呼び出しパターンの例
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;
}
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
10
本研究の目的

横断的関心事の検出
 メソッド呼び出しパターンの抽出を応用
 均一性横断的関心事と非均一性横断的関心事の両方を検
出

検出による効果
 保守性・再利用性・拡張性などの向上
 横断的関心事のアスペクト化
 横断的関心事の出現位置の管理
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
11
提案する検出手法

横断的関心事


メソッド呼び出しパターン
特定の関心事に関するコード
≒
が複数個所に分散

同種の機能を実現する
コードが複数個所に出現
≒

メソッド呼び出しパターン抽出手法を横断的関心
事の検出に応用
 横断的関心事に関連したメソッド呼び出しパターンが存
在する
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
12
メソッド呼び出しパターン抽出

既存の手法を採用[1]
 特徴シーケンスの生成
 Sequential
pattern mining
 PrefixSpanアルゴリズムを採用

Javaで書かれたプログラムを対象としたツール
を実装
[1] 中山崇,松下誠,井上克郎, ”ソースコードの差分を用いた関数呼び出しパターン抽
出法の提
案”,情報処理学会研究報告,Vol.2006,No.35,2006-SE-151,pp.49–56,2006
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
13
特徴シーケンスの生成

ソースコードの特徴




メソッド呼び出し
条件文の開始・終了要素
繰り返し文の開始・終了要素
特徴シーケンス


抽出されたコードの特徴を要素とするシーケンス
各メソッドごとに抽出
class Sample {
A a;
int i, k;
void method1 (int arg ) {
foo();
i = a.hoge();
if( i == 0 ) {
k = arg;
a.bar();
}
}
ソースコードの特徴
Sample.method1()の
特徴シーケンス
Sample.foo()
A.hoge()
if
A.bar()
}
void foo ( ) {・・・}
}
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
14
Sequential pattern mining(PrefixSpan)

特徴シーケンスに対し射影と呼ばれる操作を繰
り返し行なうことでシーケンシャルパターンを抽
出する
 射影とは,全てのシーケンスに対して特定の要素
からの接尾辞を取り出す操作
要素aによる射影
acd
cd
abc
bc
要素aの
接尾辞
cba
aab
ab
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
15
PrefixSpanの例

最低出現回数2、最小要素数1
ab,ac,を
パターンとして出力
a,b,c,を
パターンとして出力
1. a c d
2. a b c
3. c b a
4. a a b
a:4
b:3
c:3
d:1
各要素の
出現回数
1. c d
2. b c
4. a b
a:1
b:2
c:2
d:1
2. c
3. a
a:1
c:1
1. d
1. b a
a:1
b:1
d:1
射影
SIGSS研究会
2. c
c:1
1. d
d:1
結果
a :4
ab:2
ac:2
b :3
c :3
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
16
メソッド呼び出しの識別

Super
メソッドを宣言しているクラ
スを区別する
Sample()
 継承元が同じであるメソッド
Sub1
Sub2
は同一のメソッドとみなす
Sample()
Sample()
同一の特徴

メソッドを呼び出しているク
ラスを区別しない
 メソッド名のみを識別
A
B
C
Sample()
Sample()
Sample()
同一の特徴
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
17
ツールのスクリーンショット
クラス階層ツリーにおける
選択したパターンの
分散状況
抽出されたパ
ターンの設定
抽出された
パターンの
情報
ソースコード
における
選択したパターン
の分布状況
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
18
実験概要




実験対象
 JHotDraw(図形描画アプリケーション)
 総行数 : 約18000行、総メソッド数 : 約2900
抽出したパターン
 出現回数 : 4回以上
 パターンの要素数 : 4以上
 メソッド呼び出しの識別方法
 メソッドを宣言しているクラスを区別
 メソッドを宣言しているクラスを無視
評価方法
 抽出したパターンが横断的関心事と関連しているかどうかを評価
 他の文献でアスペクト化すべきであるとされている横断的関心事を参考に評価
評価基準
 パターンの出現回数
 パターンが出現するクラス数
 特定のキーワードの出現頻度
 パターンの要素であるメソッド呼び出しの名前
 パターンが出現するメソッドの名前
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
19
抽出結果

メソッドを宣言しているクラスの違いを識別した場合

抽出されたパターン数 : 38種類
横断的関心事に関連しているもの : 22種類
 横断的関心事に関連していないもの : 16種類

パターンが関連する関心事
出現回数 出現するクラス数 横断的関心事
ループ処理のイディオム
54
31
×
コマンドの取り消し
14
14
○
コマンド取消用の情報保存
12
12
○
図形の選択解除
10
10
○
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
ポリゴン処理

6
1
×
メソッドを宣言しているクラスの違いを無視した場合

抽出されたパターン数 : 55種類
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
20
抽出されたメソッド呼び出しパターンの例
(横断的関心事に関連しているパターン1)

呼び出されているメソッドの名前に特定のキーワードが多数出現
実行コマンド取消用の情報を
保存するためのパターン
AbstractCommand.setUndoActivity()
AbstractCommand.getUndoActivity()
Undoable.setAffectedFigures()
AbstractCommand.getUndoActivity()
Undoable.getAffectedFigures()
SIGSS研究会
キーワードUndo
が多数出現
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
21
抽出されたメソッド呼び出しパターンの例
(横断的関心事に関連しているパターン2)

パターンが出現するメソッドの名前に特定のキーワードが多数出現
マウス操作に関連する
パターン
MouseEvent.getX()
MouseEvent.getY()
MouseEvent.getX()
MouseEvent.getY()
抽出
抽出
抽出
class ConnectionTool{
・・・・・・・・・・・・
public void mouseUp{
・・・・・・・・・
}
}
class PolygonTool{
・・・・・・・・・・・・
public void mouseDown{
・・・・・・・・
}
}
キーワードmouse
が多数出現
class DrawingViewMouseListener{
・・・・・・・・・・・・
public void mousePressed{
・・・・・・・・
}
}
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
22
抽出されたメソッド呼び出しパターンの例
(アプリケーションの機能に関連していないパターン)
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()
}
繰り返しの制御に
関連するパターン
(横断的関心事というよりは
イディオム)
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
23
特定のクラス階層に出現するパターン

一部のサブクラスのみに出現するパターン
 横断的関心事を管理する新たなクラス階層の提案
 パターンが出現しないサブクラスは横断的関心事の実装し
忘れの可能性
AbstractCommand
Group
Group
UnGroup
AbstractUndoable
UnGroup
SelectAll
SelectAll
Zoom
Zoom
Redo
Align
Redo
Align
パターンが出現するサブクラス
パターンが出現しないサブクラス
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
24
クラスを区別せずに抽出したパターンの例
org.jhotdraw.figures.BorderTool
org.jhotdraw.standard. DuplicateCommand
public void execute() {
super.execute();
setUndoActivity(createUndoActivity());
FigureSelection selection = view().getFigureSele・・・
public void action(Figure figure) {
// Figure replaceFigure = drawing().replace(figur ・・
setUndoActivity(createUndoActivity());
List l = CollectionsFactory.current().createList();
l.add(figure);
l.add(new BorderDecorator(figure));
getUndoActivity().setAffectedFigures(new Fig ・・
((BorderTool.UndoActivity)getUndoActivity()).repl ・・
// create duplicate figure(s)
FigureEnumeration figures = (FigureEnumeration) ・・
getUndoActivity().setAffectedFigures(figures);
view().clearSelection();
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
}
AbstractTool
のサブクラス
}
AbstractCommand
のサブクラス
org.jhotdraw. standard.ResizeHandle
setUndoActivity()
createUndoActivity()
getUndoActivityI()
setAffectedFigures()
public void invokeStart(int x, int y, DrawingView view) {
setUndoActivity(createUndoActivity(view));
getUndoActivity().setAffectedFigures(new Sing ・・
((ResizeHandle.UndoActivity)getUndoActivity()).se・・・
}
AbstractHandle
のサブクラス
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
25
クラスを区別せずに抽出したパターン
Abstract
Command
11サブクラスに存在
Abstract
Handle
6サブクラスに存在
Abstract
Tool
9サブクラスに存在
AbstractCommand
.setUndoActivity()
AbstractHandle
.setUndoActivity()
AbstractTool
.setUndoActivity()
EachSubClass
.createUndoActivity()
EachSubClass
.createUndoActivity()
EachSubClass
.createUndoActivity()
AbstractCommand
.getUndoActivityI()
AbstractHandle
クラスを識別しない場合の
.getUndoActivityI()
パターン
AbstractTool
.getUndoActivityI()
Undoable
.setAffectedFigures()
Undoable
setUndoActivity()
.setAffectedFigures()
createUndoActivity()
getUndoActivityI()
setAffectedFigures()
SIGSS研究会
Undoable
.setAffectedFigures()
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
26
考察
特定の関心事に関連しているパターンには関心事の
内容を示すキーワードの出現頻度が高い
 特定のクラス階層内のみに出現するパターンが存在

 横断的関心事の実装し忘れのチェックに使用可能
 一部のサブクラスのみに出現する場合、新たなクラス階層を
提案

メソッドを宣言しているクラスを識別しないほうがより広
範囲から抽出可能
 横断的関心事に関連したメソッドには宣言が横断的なものも
ある
 他の手法にも応用可能
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
27
関連研究

アスペクトマイニング
 オブジェクト指向プログラムからアスペクトの候補と
なる部分を抽出
 均一性横断的関心事が主な抽出対象
 既存手法
 コードクローンをベースに抽出
 モジュールを横断するコードクローンをアスペクト化
 Fan-Inの大きいものを抽出
 呼び出されている場所の数が多いメソッドは横断的である可能
性が高い
 grepを用いた検索
 横断的関心事に関連したキーワードで検索
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
28
関連研究との比較

コードクローンをベースにまとめる手法


Fan-Inを利用した手法


コード記述が一致していないと検出できない
メソッドが個別に抽出されるので他のメソッドとの関連がわからない
メソッド呼び出しパターンを利用した手法


コード記述の違いをある程度吸収できる
関連するメソッドをまとめて抽出することができ、その呼び出し順序もわ
かる
⇒AOPの目的は同一のコード記述を一箇所にまとめることではなく、同一の関
心事を一箇所にまとめることであるので、コード記述の違いはある程度吸収
できたほうが良い
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
29
既存手法との比較(抽出例)
同一のメソッド呼び出しパターンを持つコード
org.jhotdraw.standard.CutCommand
public void execute() {
super.execute();
setUndoActivity(createUndoActivity());
FigureEnumeration fe = view().selection();
List affected = CollectionsFactory.current().createL・・・
Figure f;
FigureEnumeration dfe;
while (fe.hasNextFigure()) {
f = fe.nextFigure();
affected.add(0, f);
dfe = f.getDependendFigures();
・・・・・・・・・・・・・・・・・・・・・
}
fe = new FigureEnumerator(affected);
getUndoActivity().setAffectedFigures(fe);
UndoActivity ua = (UndoActivity) getUndoActivity();
ua.setSelectedFigures(view().selection());
copyFigures(ua.getSelectedFigures(), ua.getSele・・・・
deleteFigures(getUndoActivity().getAffectedFigures());
view().checkDamage();
}
コードクローンベースの手法で抽出できるコード
org.jhotdraw.fiures.GroupCommand
public void execute() {
super.execute();
setUndoActivity(createUndoActivity());
getUndoActivity().setAffectedFigures(view().selection());
((GroupCommand.UndoActivity)getUndoActivity()).group・・・
view().checkDamage();
}
org.jhotdraw.standard.AlignCommand
public void execute() {
super.execute();
setUndoActivity(createUndoActivity());
getUndoActivity().setAffectedFigures(view().selection());
((AlignCommand.UndoActivity)getUndoActivity()).alignA・・・
view().checkDamage();
}
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
30
まとめと今後の課題

メソッド呼び出しパターン抽出手法を用いて横断的関
心事の検出
 横断的関心事には特定のパターンを持つものが存在
 コードの違いをある程度吸収できるため非均一性横断的関
心事の一部も抽出可能

今後の課題
 実験対象の拡大
 本研究で得られた実験結果はJHotDraw特有の特徴から得られた
結果である可能性がある
 均一性横断的関心事と非均一性横断的関心事の識別
 均一性横断的関心事はアスペクト候補として表示
 非均一性横断的関心事は出現箇所を管理すべきコード片として表
示
SIGSS研究会
2015/10/1
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
31