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