アスペクトに よるモジュール拡張を強調したアウトラ

アスペクトによるモジュール拡張を
強調したアウトラインビューア
理学部 情報科学科
指導教官 千葉 滋 助教授
学籍番号 02-2149-7 堀江 倫大
1
アスペクト指向言語
 アスペクト指向
 オブジェクト指向の欠点を補完
 モジュール間にまたがる処理(ロギング、同期処理)
 横断的関心事の分離
 AspectJ
 代表的なアスペクト指向言語のひとつ
 Javaを言語拡張(advice、pointcut)
 アスペクトによりクラスに新たな処理を織り込む
2
従来のアスペクト指向の考え方
 アスペクトをクラス側に「挿入する」という考え
class Point {
int x, y;
public int getX() { return x; }
public int getY() { return y; }
public void setX(int x) {
this.x = x;
}
…
}
class Line {
Point p1, p2;
…
moveBy(int dx, int dy) {
p1.setX(p1.getX() + dx);
p2.setY(p2.getY()++dy);
dy);
p2.setY(p2.getY()
……
} }
……
} }
aspect aspect
public
UpdateSignaling
UpdateSignaling
{
{
pointcut move() : call(void Point.setX(int));
Point.call(int));
…
after() : move() {
Display.update();
Display update();
}
…
}
■ アドバイスの実行箇所を把握しずらい
□ setXメソッドの呼び出し箇所を把握しずらい
■ 呼び出し側のモジュール性を壊している
という意見がある
3
新しいアスペクト指向の捉え方
 呼ばれる側のクラスを「拡張する」という考え
class Point {
int x, y;
public int getX() { return x; }
public int getY() { return y; }
public void setX(int x) {
this.x = x;
}
…
}... }
class Line {
publicp1,
void
setX(int x) {
Point
p2;
…//もとのsetX()を実行
//Display.update()を実行
//呼び出し側がRectangleのとき
moveBy(int
dx, int dy) {
}p1.setX(p1.getX()
//にはDisplay.update()を実行
+ dx);
}p2.setY(p2.getY() + dy);
…
}
…
}
aspect UpdateSignaling {
Point.setX(int))
pointcut move() : call(void Point.setX(int));
&& within(Rectangle);
…
after() : move() {
Display.update();
}
…
}
■ 「メソッドの上書き」
□ モジュール性が壊されない
(継承関係と類似)
■
従来の考え方だとモジュール性が壊
れているように見えてしまうが、この
考え方ならそう見えにくい。
4
新しい捉え方に沿ったツールの開発
 モジュール(クラス)を拡張するという視点
■ Javadocコメントを同時に並べて表示 ■ 呼ばれる側にアスペクトの情報を
重ねて表示
■ 呼ばれる側に情報が集まるので、
pointcutも表示する必要がある。
■ call、get、setポイントカットに
よって指定されたアドバイスの場
call(void Point.setX(int)) (実装中)
■ ばらばらの場所にあった関連のある
合にも、ターゲット側のモジュール
コメントをひとつにまとめることで、有益
に情報を重ねて表示
な情報が得られる。
■ 各モジュールを階層的に表示
■ サブクラスのドキュメントにスーパー
クラスの仕様が書き加えられることと
■ Eclipseプラグインとして提供
同様
5
実装
 Eclipseプラグインとして開発
 ビュープラグインを利用
 SWT(Standard Widget ToolKit)を利用
 AJDT(AspectJ Development Tools)のソースを
一部参考
 AspectJ開発を可能にするEclipseプラグイン
 アドバイス、ポイントカットの情報を取得するためのコード
を一部利用
 実際のアプリケーション(AJHotDraw)を使って
動作確認
6
関連研究
 Aspect-Aware Interface [Kiczalesら’05]
 アスペクト指向とは、既存のモジュールに新しい境界を
作るもの
 その境界を定義するインターフェイスが存在する
 我々と同じ立場
 呼び出される側のモジュールに着目する点が類似
 AJDT(Aspect Development Tools)
 織り込みの情報を提供するツールが存在する
 呼び出し側に織り込みの情報を付加するだけ
 Javadocコメントに関する機能はない
7
まとめと今後の課題
 まとめ
 モジュールを拡張するという視点に立ったツール
 アスペクトの情報を重ねて表示
 Javadocコメントを結合
 今後の課題
 ポイントカット宣言に関するJavadocコメントの解析
 AspectJではなく、GluonJを利用
 表示方法の洗練(アイコンの充実)
8
既存のツール
 AJDT(AspectJ Development Tools)
■
■ Cross-Referenceビュー
AJDTエディタ
□
□ 呼び出し側に織り込みの情報
呼び出し側に織り込み箇所を
を載せる
示す
『setXメソッドの呼び出し後
にafterアドバイスが実行』
ここに織り込まれるという情報
が与えられるだけ
9