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