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
© Copyright 2024 ExpyDoc