Transcript Get Slide

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