Cachéエラー・リファレンス...1 オブジェクト・エラー・メッセージ このドキュメントでは、以下の表でオブジェクト・エラー・メッセージを示しています。CSPに関連する
横断的関心事に対応したオブジェクト指向言語 GluonJ...
description
Transcript of 横断的関心事に対応したオブジェクト指向言語 GluonJ...
大谷 晃司 千葉 滋東京工業大学
数理・計算科学専攻
横断的関心事に対応したオブジェクト指向言語 GluonJ とその織り込み関係の可視化ツール
1
あらすじ
2
2つのアスペクト指向言語GluonJ [OOPSLA ’10] と AspectJ [ECOOP ’01]
ツールの観点から2つの言語を比較 織り込み関係の表示ツール
アスペクト指向では必須のツール GluonJ の拡張アウトラインビュー AspectJ の AJDT
GluonJ では単一ツールで表示可能で優れている 関連研究とまとめ
モジュール間をまたがってしまう関心事 例 : ロギング処理、図形の再描画処理、タイマー処理など
編集、つけ外しが困難 横断的関心事に対応した言語が必要
横断的関心事とは
3
ShapesetX
GUI
Timer
setY
GUI
Timer
Rectanglese t
Height
GUI
Timer
setWidth
GUI
Timer
x 代入 y 代入 高さ代入 幅代入
GluonJ リバイザでモジュール化 リバイザはクラスの一種@Reviserclass Repainter{ @Reviser static class ShapeRepainter ex. Shape{ void setX(int x){ super.setX(x); Screen.repaint(); } @Reviser static class RectRepainter ex. Rectangle{ ...
}}
AspectJ アスペクトでモジュール化 アスペクトはクラスとは別物
アスペクト指向言語 GluonJ と AspectJ
4
aspect Repainter{ pointcut setMethods(): execution(void set*(..));
after():setMethods(){ Screen.repaint(); }}
横断的関心事のモジュール化
コードが織り込まれると同じ振る舞い実行される結果は同じ
5
@Reviser class Repainter{ @Reviser static class ShapeRepainter ex. Shape{ void setX(int x){ super.setX(x); Screen.repaint(); } @Reviser static class RectRepainter ex. Rectangle{ ...
}}
aspect Repainter{ pointcut setMethods(): execution(void set*(..));
after():setMethods(){ Screen.repaint(); }}
class Shape{ ...
void setX(int x){ this.xPos = x; Screen.repaint(); } ...
}
織り込み関係の表示ツール リバイザやアスペクトと、元のクラスの関係
ツールの観点から GluonJ と AspectJ を比較
6
ShapesetX
setY
GUI
Timer
Shape
GUI
Timer
Shape
Repainter
GUI
Timer
Timer
Repainter
Timer
x 代入 y 代入
それを知るためのツールが必要織り込み関係がわからない
7
ShapesetX
setY
GUI
Timer
Shape
GUI
Timer
Shape
Repainter
GUI
Timer
Timer
Repainter
Timer
x 代入 y 代入
あらすじ
8
2つのアスペクト指向言語GluonJ [OOPSLA ’10] と AspectJ [ECOOP ’01]
ツールの観点から2つの言語を比較 織り込み関係の表示ツール
アスペクト指向では必須のツール GluonJ の拡張アウトラインビュー AspectJ の AJDT
GluonJ では単一ツールで表示可能で優れている 関連研究とまとめ
GluonJ の場合: 拡張アウトラインビュー 単一ツールで統一的に表示可能
リバイザから見た織り込み関係も、クラスから見た織り込み関係も同じツールで表示 リバイザもクラスの一種であるため
各メソッドの間の上書きする・される関係で織り込み関係を表現
9
@Reviser class Repainter{ @Reviser static class ShapeRepainter ex. Shape{ void setX(int x){ super.setX(x); Screen.repaint(); } } @Reviser static class RectRepainter ex. Rectangle{ ...}}
リバイザ
class Shape{ ...
void setX(int x){ this.xPos = x; // Screen.repaint(); }}
クラス
拡張アウトラインビュー (1/3) Eclipse プラグインとして開発 織り込み関係を階層的に表示
どのメソッドに織り込みが行われるかを表示クラス側 リバイザ側
10
拡張アウトラインビュー (2/3) 織り込みを行うリバイザが複数存在
@Require で織り込みを行う順番を設定 織り込みを行う順番で上から列挙する 織り込む順番が曖昧な場合はエラー表示
11
リバイザ側クラス側
within メソッド 特定のメソッドから呼び出された時のみ織り込み
@Reviserclass Repainter{ @Reviser static class ShapeRepainter ex. Shape{ @Within(FigureEditor.class) @Code("mouseDragged (java.awt.event.MouseEvent)") void setX(int x){ super.setX(x); Screen.repaint(); } …
} @Reviser static class RectRepainter ex. Rectangle{ ...
}}
12
class FigureEditor implements MouseMotionListener,MouseListener { …
void mouseDragged(MouseEvent e) { …
clickShape.setX(newX); …
} …
}
FigureEditor クラスのmouseDragged ( MouseE
vent )メソッド内でsetX(int) メソッドが呼ばれた時のみ織り込みを適用
拡張アウトラインビュー (3/3) within メソッドに対応
特定のクラスのメソッドから呼ばれた時のみ織り込みを行う 指定されたクラスとメソッドを表示
13
クラス側 リバイザ側
あらすじ
14
2つのアスペクト指向言語GluonJ [OOPSLA ’10] と AspectJ [ECOOP ’01]
ツールの観点から2つの言語を比較 織り込み関係の表示ツール
アスペクト指向では必須のツール GluonJ の拡張アウトラインビュー AspectJ の AJDT
GluonJ では単一ツールで表示可能で優れている 関連研究とまとめ
単一ツールで織り込み関係を統一的に見せる事が出来ない 織り込み関係を知るには複数のツールを切り替えて使う必要がある クラスとアスペクトに分けている事が原因
クラスとアスペクトで表示方法が変わる
AspectJ の場合: AJDT(AspectJ Development Tools)
aspect Repainter{ pointcut setMethods(): execution(void set*(..));
after():setMethods(){ Screen.repaint(); }}
class Shape{ ...
void setX(int x){ this.xPos = x; // Screen.repaint(); } ...
}
アスペクトクラス
15
AJDT: エディタ ソースコード内で織り込みが行われる箇所にマーク
織り込み関係は表示されない 全てのソースコードを確認しなければならない
16
クラス側 アスペクト側
AJDT: アウトラインビュー クラス側
織り込みが行われるメソッドをマークで表示 詳しい織り込みの内容を確認することが出来ない
アスペクト側 アドバイス名と種類を表示 織り込み先の情報が無い
17
クラス側 アスペクト側
AJDT: Cross-References ビュー 織り込み関係をクラス側、アスペクト側の双方から表示
クラスの視点では他の情報がなくなる アスペクトの視点では同じメソッドへ織り込みを行う別のアスペクトを知ることが出来ない
18
クラス側 アスペクト側
AJDT: Visualiser ビュー プロジェクト全体の織り込み関係を色分けで表示
メソッド名、アドバイスなどが表示されない ( 抽象的過ぎる ) エディタで開いてソースコードを確認する必要がある
19
まとめ 織り込み関係表示ツールの観点から 2 つのアスペクト指向言語を比較 GluonJ + 拡張アウトラインビュー Better
単一ツールで織り込み関係を統一的に見せられる リバイザはクラスの一種だから
GluonJ の言語仕様により良い織り込み関係表示ツールが実現可能に AspectJ + AJDT
織り込み関係を知る為に様々なツールを併用する必要 クラスとアスペクトに分けている事が原因
クラスとアスペクトで表示方法が変わる20
関連研究と今後の課題 AspectMaps[Fabry ら ‘ 11]
アスペクトの織り込み関係を色分けで表示 織り込みが行われる順番を重視 表示方法が抽象的 エディタを開いてソースコードを確認する必要がある
今後の課題 within メソッドで指定されたメソッドへの表示 評価
実際に使用してもらい、ビューの切り替えを行う回数を調べる
21