AspectScope

AspectScope によるアスペクト
とクラスのつながりの視覚化
堀江倫大 千葉滋
東京工業大学
1
アスペクト指向言語

ジョインポイント

プログラム中のイベントが発生するとき


ポイントカット

どのイベント発生時にコードを実行するか


例: Graphicsクラスのdrawメソッドを呼び出すとき
プリミティブなポイントカット


メソッド呼び出し時、フィールド参照時など
set: フィールドへの代入、 get: フィールドの参照、
execution: メソッドの実行、 call: メソッド呼び出しなど
アドバイス

ポイントカットが指定したタイミングで実行する処理

例: ログ出力処理
2
ログ出力

オブジェクト指向では、Logger クラスを定義して直
接利用


ログ出力させたい箇所に挿入
ログ出力コードを取り除きたいときは挿入したコードを削
除する必要
class Logger {
public static void log(String msg) {
System.out.println(msg);
}
}
class Canvas {
Image img;
:
void paint(Graphics g) {
:
Logger.log(“log”);
g.draw(img);
:
}
}
3
アスペクト指向の利用

AspectJ: 代表的なアスペクト指向言語のひとつ
Graphics クラスの draw メソッド呼び出し前に Logger.log メソッドを実行
アスペクト
aspect LogAspect {
ポイントカット
pointcut logged() :
call(void Graphics.draw());
アドバイス
before() : logged() {
//ログ出力
Logger.log(“log");
}
}
class Canvas {
Image img;
:
void paint(Graphics g) {
:
g.draw(img);
:
}
}
class Graphics {
:
void draw(Image img) {
:
}}
4
アスペクト指向
モジュール間の結びつきを緩める
利点: クラスの定義を変更せずに、アスペクトにより振
る舞いを変更することが可能

欠点: モジュール間の結びつきが見えなくなってしまう

欠点を補うため、これまで様々な研究が成されてきた



AJDT(AspectJ Development Tools)
XPI(Crosscutting Programming Interface)
Open Modules など
5
モジュール間の結びつきを「見える化」

従来の多くの研究

モジュールインターフェースを拡張して表現
イベント(ポイントカット)
アドバイス
モジュール(クラス)
メソッド
6
AJDT

AJDT エディターと Visualiser ビュー


ポイントカットによって選択されたジョインポイントを表示
アドバイスが結びつく「イベント」の発生位置を示す

カプセル化が壊れる
AJDTエディター
Visualiserビュー
7
AspectScope の提案

クラスのアウトラインビューア


AspectJ 用の Eclipse プラグイン
アスペクトによって織り込まれたクラスのメンバのアウトラ
インを表示する

各メンバをインターフェースとして列挙し、その仕様の詳細を表示
outline
Javadoc
8
AspectScope の「見える化」

モジュールインターフェースの拡張なしで
モジュール間の結びつきを表現


Good!
従来の枠組みのままでアスペクトに対応
アスペクトはモジュールのメソッドの挙動を拡張すると考える
アドバイス
モジュール(クラス)
メソッド
9
AJDT
callポイントカット (get、setポイントカット)

アドバイスは呼び出し側のメソッドの前後で実行される
ものととらえる
after(): call(void Point.setX(int)) {
Display.update();
}
呼び出し側クラ
ス
AJDTエディタ
10
AspectScope
callポイントカット (get、setポイントカット)

呼ばれた側のメソッドが拡張されたととらえる
after(): call(void Point.setX(int)) {
Display.update();
}
AspectScope
呼ばれる側のクラ
ス
11
within、cflow ポイントカット

条件的な拡張とみなす
after(): call(void Point.setX(int)) && within(Line) {
Display.update();
}
条件付き拡張
12
javadoc コメントによる拡張の説明

ソースコードからコメントを集めて独自の javadoc コ
メントを表示
setXメソッドの実装から抽出
ポイントカットの実装から
抽出
アドバイスの実装か
ら抽出
13
pointcut の説明

ポイントカットの定義を自然言語で表現
pointcut move() :
call(void Shape+.set*(int))
|| call(void Shape+.moveBy(..));
void setX(int)
ワイルドカードの 「*」、「+」、「..」は
具体的な名前に置き換えられる
after(): move() && within(Line) {
Display.update();
}
14
具体例1: Observer アスペクト
 Setter メソッドが呼び出されるときにアドバイスが実
行される
Display
Shape
*
1
…
…
LineクラスのsetP1メソッド内
でsetXメソッドが呼ばれると
きにはアドバイスは実行しな
い。
Line
Point
setP1(Point p1)
setP2(Point P2)
…
setX(int x)
setY(int y)
…
update()
…
pointcut change() : call(void Shape+.set*(..));
after(): change() && !cflowbelow(change()) {
Display.update();
}
Rectangle
…
…
…
15
AspectScope vs. AJDT
AspectScope
AJDTエディタ
AJDT では呼び出し側で
ジョインポイントシャドウ
を表示するだけ
AspectScope は、setP1 メソッド
が呼ばれるときには1度だけ
update メソッドが呼ばれることが
表示される。
16
具体例2: Loggingアスペクト

Canvas クラス内で Graphics クラスの draw メソッ
ドを呼び出すときにログを出力する
class Canvas {
Image image;
:
void paint(Graphics g) {
:
g.draw(image);
:
}
:
}
aspect LoggingAspect {
before(): call(* Graphics.draw(..))
&& within(Canvas) {
System.out.println(“log”);
}
}
17
AspectScope vs. AJDT
AspectScope
AJDTエディタ
AJDTは呼び出し側のどの箇
所でログ出力が行われるかを
表示する
AspectScopeは呼ばれる側
がどう拡張されるかを表示する
before() : call(void Graphics.draw(Image))
&& within(Canvas) {
System.out.println(…);
}
18
関連研究

Aspect-Aware Interface [Kiczalesら、‘05]


AspectScopeと基本的な考えは同じ
概念的な考えのみを提案



call、get、setポイントカットに関する具体的な提案はない
javadocコメントに関する考察もない
Classbox/J [Bergelら、‘05]


ある条件化でのみ有効なクラスの拡張を定義できるという考
えが類似
しかし、アスペクト指向言語ではない
19
まとめ

AspectScope:
AspectJ用のプログラミングツール




クラスのアウトラインを表示
呼ばれる側のクラスがどのように拡張されたかを表示
javadocコメントを集めることで、拡張の詳細を表示
モジュールインタフェースの拡張なしでモジュール間の結び
つきを表現
20