20
1 AspectScope ににににににににに にににににににににににに にににに ににに にににににに

AspectScope によるアスペクトとクラスのつながりの視覚化

Embed Size (px)

DESCRIPTION

AspectScope によるアスペクトとクラスのつながりの視覚化. 堀江倫大 千葉滋         東京工業大学. アスペクト指向言語. ジョインポイント プログラム中のイベントが発生するとき メソッド呼び出し時、フィールド参照時など ポイントカット どのイベント発生時にコードを実行するか 例 : Graphics クラスの draw メソッドを呼び出すとき プリミティブなポイントカット set: フィールドへの代入、 get: フィールドの参照、 execution: メソッドの実行、 call: メソッド呼び出しなど アドバイス - PowerPoint PPT Presentation

Citation preview

Page 1: AspectScope によるアスペクトとクラスのつながりの視覚化

1

AspectScope によるアスペクトとクラスのつながりの視

覚化

            堀江倫大 千葉滋

        東京工業大学

Page 2: AspectScope によるアスペクトとクラスのつながりの視覚化

2

アスペクト指向言語 ジョインポイント

プログラム中のイベントが発生するとき メソッド呼び出し時、フィールド参照時など

ポイントカット どのイベント発生時にコードを実行するか

例 : Graphics クラスの draw メソッドを呼び出すとき プリミティブなポイントカット

set: フィールドへの代入、 get: フィールドの参照、  execution: メソッドの実行、 call: メソッド呼び出しなど

アドバイス ポイントカットが指定したタイミングで実行する処理

例 : ログ出力処理

Page 3: AspectScope によるアスペクトとクラスのつながりの視覚化

3

ログ出力 オブジェクト指向では、 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); : }}

Page 4: AspectScope によるアスペクトとクラスのつながりの視覚化

4

アスペクト指向の利用 AspectJ: 代表的なアスペクト指向言語のひとつ

アスペクトaspect LogAspect { ポイントカット pointcut logged() : call(void Graphics.draw());

アドバイス before() : logged() { // ログ出力 Logger.log(“log"); }}

class Canvas { Image img; : void paint(Graphics g) { : g.draw(img); : }}

Graphics クラスの draw メソッド呼び出し前に Logger.log メソッドを実行

class Graphics { : void draw(Image img) { : }}

Page 5: AspectScope によるアスペクトとクラスのつながりの視覚化

5

アスペクト指向 モジュール間の結びつきを緩める利点 : クラスの定義を変更せずに、アスペクトにより振

る舞いを変更することが可能

欠点 : モジュール間の結びつきが見えなくなってしまう

欠点を補うため、これまで様々な研究が成されてきた AJDT ( AspectJ Development Tools ) XPI ( Crosscutting Programming Interface ) Open Modules  など

Page 6: AspectScope によるアスペクトとクラスのつながりの視覚化

6

モジュール間の結びつきを「見える化」 従来の多くの研究

モジュールインターフェースを拡張して表現

モジュール(クラス)

イベント(ポイントカット)

アドバイス

メソッド

Page 7: AspectScope によるアスペクトとクラスのつながりの視覚化

7

AJDT

AJDT エディターと Visualiser ビュー ポイントカットによって選択されたジョインポイントを

表示 アドバイスが結びつく「イベント」の発生位置を示す

カプセル化が壊れるAJDT エディター Visualiser ビュー

Page 8: AspectScope によるアスペクトとクラスのつながりの視覚化

8

AspectScope の提案 クラスのアウトラインビューア

AspectJ 用の Eclipse プラグイン アスペクトによって織り込まれたクラスのメンバの

アウトラインを表示する 各メンバをインターフェースとして列挙し、その仕様の詳細

を表示

outline Javadoc

Page 9: AspectScope によるアスペクトとクラスのつながりの視覚化

9

AspectScope の「見える化」 モジュールインターフェースの拡張なしで

モジュール間の結びつきを表現 従来の枠組みのままでアスペクトに対応 アスペクトはモジュールのメソッドの挙動を拡張すると考える

Good!

モジュール(クラス)

アドバイス

メソッド

Page 10: AspectScope によるアスペクトとクラスのつながりの視覚化

10

AJDTcall ポイントカット (get 、 set ポイントカット ) アドバイスは呼び出し側のメソッドの前後で実行

されるものととらえる

AJDTエディタ

after(): call(void Point.setX(int)) { Display.update();} 呼び出し側クラ

Page 11: AspectScope によるアスペクトとクラスのつながりの視覚化

11

AspectScopecall ポイントカット (get 、 set ポイントカット ) 呼ばれた側のメソッドが拡張されたととらえる

AspectScope

呼ばれる側のクラス

after(): call(void Point.setX(int)) { Display.update();}

Page 12: AspectScope によるアスペクトとクラスのつながりの視覚化

12

within 、 cflow ポイントカット 条件的な拡張とみなす

after(): call(void Point.setX(int)) && within(Line) { Display.update();}

条件付き拡張

Page 13: AspectScope によるアスペクトとクラスのつながりの視覚化

13

javadoc コメントによる拡張の説明

ソースコードからコメントを集めて独自の javadoc コメントを表示

setX メソッドの実装から抽出

ポイントカットの実装から抽出

アドバイスの実装から抽出

Page 14: AspectScope によるアスペクトとクラスのつながりの視覚化

14

pointcut の説明 ポイントカットの定義を自然言語で表現

pointcut move() : call(void Shape+.set*(int)) || call(void Shape+.moveBy(..));

after(): move() && within(Line) { Display.update();}

ワイルドカードの 「 * 」、「 + 」、「 .. 」は 具体的な名前に置き換えられる

void setX(int)

Page 15: AspectScope によるアスペクトとクラスのつながりの視覚化

15

具体例1 : Observer アスペクト Setter メソッドが呼び出されるときにアドバイ

スが実行される Shape

… …

Point

setX(int x) setY(int y) …

Line

setP1(Point p1) setP2(Point P2) …

Rectangle

… … …

Display

update() …

* 1

pointcut change() : call(void Shape+.set*(..));after(): change() && !cflowbelow(change()) { Display.update();}

Line クラスの setP1 メソッド内で setX メソッドが呼ばれるときにはアドバイスは実行しない。

Page 16: AspectScope によるアスペクトとクラスのつながりの視覚化

16

AspectScope vs. AJDTAJDTエディタ

AJDT では呼び出し側でジョインポイントシャドウを表示するだけ

AspectScope

AspectScope は、 setP1 メソッドが呼ばれるときには1度だけ update メソッドが呼ばれることが表示される。

Page 17: AspectScope によるアスペクトとクラスのつながりの視覚化

17

具体例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”); } }

Page 18: AspectScope によるアスペクトとクラスのつながりの視覚化

18

AspectScope vs. AJDTAJDTエディタAspectScope

AspectScopeは呼ばれる側がどう拡張されるかを表示する

AJDTは呼び出し側のどの箇所でログ出力が行われるかを表示する

before() : call(void Graphics.draw(Image)) && within(Canvas) { System.out.println(…); }

Page 19: AspectScope によるアスペクトとクラスのつながりの視覚化

19

関連研究 Aspect-Aware Interface [Kiczales ら、‘ 05]

AspectScope と基本的な考えは同じ 概念的な考えのみを提案

call 、 get 、 set ポイントカットに関する具体的な提案はない javadoc コメントに関する考察もない

Classbox/J [Bergel ら、‘ 05] ある条件化でのみ有効なクラスの拡張を定義できるとい

う考えが類似 しかし、アスペクト指向言語ではない

Page 20: AspectScope によるアスペクトとクラスのつながりの視覚化

20

まとめ AspectScope:           AspectJ 用のプログラミングツー

ル クラスのアウトラインを表示 呼ばれる側のクラスがどのように拡張されたかを表示 javadoc コメントを集めることで、拡張の詳細を表示 モジュールインタフェースの拡張なしでモジュール間

の結びつきを表現