Download presentation
Presentation is loading. Please wait.
1
クラスのインターフェース やその振る舞いに及ぼすアスペクトの影響の解析と可視化
堀江 倫大 千葉 滋 東京工業大学
2
モジュラープログラミング 全体をモジュールに分割 モジュール(=クラス)の (インタフェースの)仕様を決める 仕様だけを見てプログラミング
モジュール(=クラス)の (インタフェースの)仕様を決める 仕様だけを見てプログラミング クラスの仕様: シグネチャ + メソッドの振る舞い 情報隠蔽 内部実装は見なくてすむ
3
Java の場合 クラスの仕様と実装を一緒に考える 例) javadoc コメント メソッドの仕様 (javadoc コメント)
class Line extends Shape { : /** * moves this shape dx along the x axis * and dy along the y axis. */ public vod moveBy(int dx, int dy) { p1.setX(p1.getX() + dx); p1.setY(p1.getY() + dy); p2.setX(p2.getX() + dx); p2.setY(p2.getY() + dy); } } メソッドの仕様 (javadoc コメント) メソッドの実装
4
AspectJ の場合 例:図形エディタへの機能追加
事前条件を追加するアスペクトを定義 Point クラスの setX、setY メソッドの振る舞いを変更 図形エディタのウィンドウ サイズ (0 < x < 100、 0 < y < 50) 内に図 形は描画されなければならない 50 100 × aspect Contract { before(int x) : call(void Point.setX(int)) && args(x) && within(Shape+) { if (x < 0 || 100 < x) throw new IllegalArgumentException(); } before(int y) : call(void Point.setY(int)) && args(y) && within(Shape+) { if (y < 0 || 50 < y) throw new IllegalArgumentException(); }}
5
アスペクト指向(AOP)に対する批判 モジュラープログラミングが不十分 仕様だけを見てプログラミングできない
class Line extends Shape { : /** * x 軸方向に dx、y 軸方向に dy だけ * 直線を平行移動させる */ public vod moveBy(int dx, int dy) { p1.setX(p1.getX() + dx); p1.setY(p1.getY() + dy); p2.setX(p2.getX() + dx); p2.setY(p2.getY() + dy); }} 正しくなくなる aspect Contract { : if (x < 0 || 100 < x) throw new IllegalArgumentException(); }
6
仕様の間の依存関係 アスペクトによって呼び出しの上流・下流の仕様も変わる class MultiLines {
private List lines; : /** * x 軸方向に dx、y 軸方向に dy * だけ多重線を平行移動させる */ void moveBy(int dx, int dy) { for (Iterator it = lines.iterator(); it.hasNext();) ((Line) it).moveBy(dx, dy); }} class Line { : /** * x 軸方向に dx、y 軸方向に dy * だけ直線を平行移動させる */ public vod moveBy(int dx, int dy) { p1.setX(p1.getX() + dx); }} class Point { private int x, y; : /** x 座標の値を設定 */ void setX(int nx) { x = nx; }} aspect Contract { …. }
7
開発ツール:AspectScope アスペクト 実装の変更 pointcut-advice 仕様の変更 アドバイスのコメント
仕様の変更 アドバイスのコメント class Line extends Shape { : /** * x 軸方向に dx、y 軸方向に dy だけ * 直線を平行移動させる */ public vod moveBy(int dx, int dy) { p1.setX(p1.getX() + dx); p1.setY(p1.getY() + dy); p2.setX(p2.getX() + dx); p2.setY(p2.getY() + dy); }} aspect Contract { /** * 直線の両端の x 座標は 0 以上 100 以下 * に制限される */ before(int x) : … { if (x < 0 || 100 < x) throw new IllegalArgumentException(); } : }} Weave Weave
8
変更後の仕様はツールが表示 Eclipse プラグインとして開発
9
織り込まれた仕様の表示 AspectScope のテキストエディタ マーカー: 仕様が変わっている箇所
javadoc コメント: 変更後のメソッドの振る舞い アスペクトが追加したコメント
10
アスペクト中の仕様の変更点の記述 comment アノテーション アドバイスのコメント 織り込み先ごとに別々のコメントを用意
* The set value x should be no fewer than 0, nor more than 100 * only if the caller is the subclasses of Shape * * @comment (execution(void Line.moveBy(int, int))) * The horizontal position of both the starting point and the end * point should be no fewer than 0, nor more than 100 * @comment (execution(void MultiLines.moveBy(int, int))) * The horizontal position of this line should be no fewer than 0, * nor more than 100 */ before(int x) : call(void Point.setX(int)) && args(x) && within(Shape+) { … }
11
呼び出しの上流・下流にも織り込み メソッドごとに異なるコメントを織り込む class MultiLines {
private List lines; : /** * x 軸方向に dx、y 軸方向に dy * だけ多重線を平行移動させる * 多重線の x 座標は 0 以上 100 * 以下の範囲内に制限される */ void moveBy(int dx, int dy) { for (Iterator it = lines.iterator(); it.hasNext();) ((Line) it).moveBy(dx, dy); }} class Line { : /** * x 軸方向に dx、y 軸方向に dy * だけ直線を平行移動させる * 直線の両端の x 座標は * 0<x<100 に制限される */ public vod moveBy(int dx, int dy) { p1.setX(p1.getX() + dx); }} class Point { private int x, y; : /** x 座標の値を設定 * Shape のサブクラ * スから呼ばれたとき * だけ 0<x<100 に * 制限される */ void setX(int nx) { x = nx; }} aspect Contract { */ }
12
コメントの織り込み先の指定 織り込み先の条件指定 条件なし execution( method pattern )
特定のメソッド within( class pattern ) 特定のクラス内、パッケージ内のメソッド (例) within(* csg.figures.*) caller( int ) n 段前の呼び出し階層 同様の処理を行うメソッド Line moveBy csg.figures Point Line Arrow Rectangle … Rectangle moveBy Point setX Triangle moveBy Contract
13
outline ビュー クラスの中で定義されたメソッドとフィールドの列挙 ソースコードを見る必要はない
アスペクトによって変更されていたらアイコン( )を表示する ソースコードを見る必要はない UndoCmdAspect によって拡張
14
実アプリケーションでの調査 目的 対象アプリケーション アスペクトの織り込みにより、仕様が変わっているか
織り込み先ごとに異なるコメントを必要としているか 対象アプリケーション Web アプリケーション Health Watcher (HW) [A. Rashid ら ‘07] クラス数 692 (LOC: 9,591)、アスペクト数 25 (LOC: 1,989) アスペクトの使用方法は5通り デザインパターン、例外処理、永続化、トランザクション、ロギング
15
AspectScope の適用結果 記述したコメントの種類と追加された箇所の数 Observer パターンにおける追加コメントの例
必要性が確認された 記述したコメントの種類と追加された箇所の数 Observer パターンにおける追加コメントの例 setPassword: “Calls <code>updateObserver</code> after setting the new password of the employee to update the Observer.” executeCommand: “Updates the information of the employees by calling <code>updateObserver</code>.” パターン 拡張したメソッド数 呼ばれる側 呼び出し1階層上 呼び出し 2階層上 3階層上 6階層上 9階層上 Observer Command Factory State 17 3 15 17 NA 14 0 13 10 5 2 まとめを言う。
16
関連研究: Aspect-Aware Interface (AAI)
AAIの概念を提案した論文 [G. Kiczales ら ‘05] 「AOP には OOP とは異なる新しいインターフェース AAI が存在する 」 AspectScope は AAI を具現化したツール 変更後の仕様の表現を工夫 コメントとして書く ツールで変更後のコメントを見る AAIは上流・下流への影響を考慮していない
17
関連研究: Open Module AOP の能力を制限して、モジュラープログラミングを可能にしている
クラス側からは、どこが拡張されるかが分かる Open Module に公開されたポイントカットしか、アスペクトは拡張できない 将来の機能拡張に備えて ポイントカットを予め公開して おくのは難しい AOP の利点を損なう module FigureModule { class Line; expose call(void Point.setX(int)) || call(void Point.setY(int)); }
18
まとめ: AspectScope はモジュラーな AOPを支援
ツールが変更された仕様を表示 元の実装の javadoc + アスペクトが追加した javadoc エディタのマーカー、アウトラインビューによる更新点の通知 Eclipse プラグインとして開発 M. Horie, S. Chiba. “AspectScope: An OutlineView for AspectJ Programs”, Journal of Object Technology
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.