p Aspect J Graphics draw Logger log aspect

  • Slides: 20
Download presentation

アスペクト指向の利用 p Aspect. J: 代表的なアスペクト指向言語のひとつ Graphics クラスの draw メソッド呼び出し前に Logger. log メソッドを実行 アスペクト aspect

アスペクト指向の利用 p Aspect. J: 代表的なアスペクト指向言語のひとつ Graphics クラスの draw メソッド呼び出し前に Logger. log メソッドを実行 アスペクト aspect Log. Aspect { ポイントカット 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

within、cflow ポイントカット p 条件的な拡張とみなす after(): call(void Point. set. X(int)) && within(Line) { Display. update();

within、cflow ポイントカット p 条件的な拡張とみなす after(): call(void Point. set. X(int)) && within(Line) { Display. update(); } 条件付き拡張 12

具体例1: Observer アスペクト p Setter メソッドが呼び出されるときにアドバイスが実 Display 行される Shape * 1 … … Lineクラスのset.

具体例1: Observer アスペクト p Setter メソッドが呼び出されるときにアドバイスが実 Display 行される Shape * 1 … … Lineクラスのset. P 1メソッド内 でset. Xメソッドが呼ばれると きにはアドバイスは実行しな い。 Line Point set. P 1(Point p 1) set. P 2(Point P 2) … set. X(int x) set. Y(int y) … update() … pointcut change() : call(void Shape+. set*(. . )); after(): change() && !cflowbelow(change()) { Display. update(); } Rectangle … … … 15

具体例2: Loggingアスペクト p Canvas クラス内で Graphics クラスの draw メソッ ドを呼び出すときにログを出力する class Canvas { Image

具体例2: Loggingアスペクト p Canvas クラス内で Graphics クラスの draw メソッ ドを呼び出すときにログを出力する class Canvas { Image image; : void paint(Graphics g) { : g. draw(image); : } aspect Logging. Aspect { before(): call(* Graphics. draw(. . )) && within(Canvas) { System. out. println(“log”); } } 17

Aspect. Scope vs. AJDT Aspect. Scope AJDTエディタ AJDTは呼び出し側のどの箇 所でログ出力が行われるかを 表示する Aspect. Scopeは呼ばれる側が どう拡張されるかを表示する before()

Aspect. Scope vs. AJDT Aspect. Scope AJDTエディタ AJDTは呼び出し側のどの箇 所でログ出力が行われるかを 表示する Aspect. Scopeは呼ばれる側が どう拡張されるかを表示する before() : call(void Graphics. draw(Image)) && within(Canvas) { System. out. println(…); } 18