横断的関心事に対応したオブジェクト指向言語GluonJとその織り込み関係の可視化ツール 大谷 晃司 千葉 滋 東京工業大学 数理・計算科学専攻
あらすじ 2つのアスペクト指向言語 GluonJ [OOPSLA ’10] と AspectJ [ECOOP ’01] ツールの観点から2つの言語を比較 織り込み関係の表示ツール アスペクト指向では必須のツール GluonJ の拡張アウトラインビュー AspectJ の AJDT GluonJ では単一ツールで表示可能で優れている 関連研究とまとめ
横断的関心事とは モジュール間をまたがってしまう関心事 編集、つけ外しが困難 例: ロギング処理、図形の再描画処理、タイマー処理など 横断的関心事に対応した言語が必要 Shape Rectangle setX setY setHeight setWidth x代入 y代入 高さ代入 幅代入 GUI GUI GUI GUI Timer Timer Timer Timer
アスペクト指向言語 GluonJ と AspectJ 横断的関心事のモジュール化 GluonJ リバイザでモジュール化 リバイザはクラスの一種 AspectJ アスペクトでモジュール化 アスペクトはクラスとは別物 @Reviser class Repainter{ 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){ ... void setX(int x){ this.xPos = x; Screen.repaint(); } @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(); }
ツールの観点からGluonJとAspectJを比較 織り込み関係の表示ツール リバイザやアスペクトと、元のクラスの関係 Shape Timer GUI Timer GUI Timer Repainter Shape GUI Shape setX setY Repainter x代入 y代入 Timer Timer
織り込み関係がわからない それを知るためのツールが必要 Shape Timer GUI Timer GUI Timer Repainter setX setY Repainter x代入 y代入 Timer Timer 7
あらすじ 2つのアスペクト指向言語 GluonJ [OOPSLA ’10] と AspectJ [ECOOP ’01] ツールの観点から2つの言語を比較 織り込み関係の表示ツール アスペクト指向では必須のツール GluonJ の拡張アウトラインビュー AspectJ の AJDT GluonJ では単一ツールで表示可能で優れている 関連研究とまとめ
GluonJ の場合: 拡張アウトラインビュー 単一ツールで統一的に表示可能 リバイザから見た織り込み関係も、クラスから見た織り込み関 係も同じツールで表示 リバイザもクラスの一種であるため 各メソッドの間の上書きする・される 関係で織り込み関係を表現 リバイザ @Reviser class Repainter{ @Reviser static class ShapeRepainter ex. Shape{ void setX(int x){ super.setX(x); Screen.repaint(); } } RectRepainter ex. Rectangle{ ...}} クラス class Shape{ ... void setX(int x){ this.xPos = x; // Screen.repaint(); } 9
拡張アウトラインビュー(1/3) Eclipseプラグインとして開発 織り込み関係を階層的に表示 どのメソッドに織り込みが行われるかを表示 クラス側 リバイザ側 10
拡張アウトラインビュー(2/3) 織り込みを行うリバイザが複数存在 織り込みを行う順番で上から列挙する 織り込む順番が曖昧な場合はエラー表示 @Requireで織り込みを行う順番を設定 織り込みを行う順番で上から列挙する 織り込む順番が曖昧な場合はエラー表示 クラス側 リバイザ側 11
withinメソッド 特定のメソッドから呼び出された時のみ織り込み FigureEditorクラスのmouseDragged(MouseEvent)メソッド内でsetX(int)メソッドが呼ばれた時のみ織り込みを適用 @Reviser class Repainter{ 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{ ... class FigureEditor implements MouseMotionListener,MouseListener { … void mouseDragged(MouseEvent e) { clickShape.setX(newX); } 12
拡張アウトラインビュー(3/3) withinメソッドに対応 指定されたクラスとメソッドを表示 特定のクラスのメソッドから呼ばれた時のみ織り込みを行う 指定されたクラスとメソッドを表示 クラス側 リバイザ側 13
あらすじ 2つのアスペクト指向言語 GluonJ [OOPSLA ’10] と AspectJ [ECOOP ’01] ツールの観点から2つの言語を比較 織り込み関係の表示ツール アスペクト指向では必須のツール GluonJ の拡張アウトラインビュー AspectJ の AJDT GluonJ では単一ツールで表示可能で優れている 関連研究とまとめ
AspectJ の場合:AJDT(AspectJ Development Tools) 単一ツールで織り込み関係を統一的に見せる事が出来 ない 織り込み関係を知るには 複数のツールを切り替えて使う必要がある クラスとアスペクトに分けている事が原因 クラスとアスペクトで表示方法が変わる クラス アスペクト class Shape{ ... void setX(int x){ this.xPos = x; // Screen.repaint(); } aspect Repainter{ pointcut setMethods(): execution(void set*(..)); after():setMethods(){ 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