スライド 1

プログラムの織り込み関係を可視化
するアウトラインビューの提案と実装
理学部 情報科学科
07_05108 大谷 晃司
指導教員 千葉 滋
1
オブジェクト指向を用いたソフトウェア開発の問題点
関心事ごとにモジュール化する事が出来ない



図形エディタの再描画処理、タイマー処理など
横断的関心事がクラス間をまたがってしまう
Shape
2
Rectangle
setX
setY
setHeight
setWidth
代入
代入
代入
代入
GUI
GUI
GUI
GUI
Timer
Timer
Timer
Timer
アスペクト指向言語で分離 1/3
GluonJ



クラス機構の拡張だけでアスペクト指向を実現
横断的関心事を一つのモジュール(リバイザ)にまとめる
Shape
Repainter
setX
setY
代入
代入
GUI
GUI Rectangle
Timer
setX
Timer
setWidth
代入
代入
GUI
GUI
@Reviser
ShapeRepainter
class Repainter{
@Reviser
setX
setY
static class ShapeRepainter ex. Shape{
void setX(int x){
super.setX(x);
Screen.repaint();
RectangleRepainter
}
@Reviser static
setHeight
setWidth
class RectRepainter ex. Rectangle{
...
Timer
3
Timer
}
}
アスペクト指向言語で分離 2/3
GluonJ




クラス機構の拡張だけでアスペクト指向を実現
横断的関心事を一つのモジュール(リバイザ)にまとめる
@Reviserを用いてプログラムの織り込み
class Shape{
@Reviser
class Repainter{
void setX(int x){
@Reviser
this.xPos = x;
static class ShapeRepainter ex. Shape{
// Screen.repaint();
void setX(int x){
}
class Rectangle ex.Shape{
...
super.setX(x);
...
}
Screen.repaint();
void setWidth(int w){
差分を一つの
}
this. width = w;
モジュールにまとめる
@Reviser static
// Screen.repaint();
class RectRepainter ex. Rectangle{
}
...
...
...
}
4
}
}
アスペクト指向言語で分離 3/3
それぞれの横断的関心事をモジュールに分離

Repainter
GUI
GUI
Shape
Timer
Timer
Timer
ShapeRepainter
setX
setY
GUI
GUI
Shape
setX
setY
代入
代入
Timer
Shape
Repainter
5
ShapeTimer
setX
setY
Timer
Timer
問題:既存のアウトラインビューでは情報不足
分離させたモジュールの情報を知ることが出来ない

Repainter
GUI
Shape
Timer
Timer
GUI
Timer
ShapeRepainter
setX
setY
GUI
GUI
Shape
setX
setY
代入
代入
Timer
Shape
Repainter
6
ShapeTimer
setX
setY
Timer
Timer
提案:視点に応じて関連する織り込み情報を提供する
アウトラインビュー
織り込みの情報をそれぞれの視点に応じて提供

Repainter
GUI
Shape
Timer
Timer
GUI
Timer
ShapeRepainter
setX
setY
GUI
GUI
Shape
setX
setY
代入
代入
Timer
Shape
Repainter
7
ShapeTimer
setX
setY
Timer
Timer
Shapeから見たアウトラインビュー
メソッドの織り込みの順序を階層表示


織り込みの情報をそれぞれの視点に応じて提供
織り込みが行われるクラス
(Shape)のアウトラインビュー
織り込みが行われるメソッド
(Shapeクラスのsetメソッド)
最初に織り込みを行うメソッド
(RepainterリバイザのGUI処理)
二番目に織り込みを行うメソッド
(Timerリバイザのタイマー処理)
8
Repainterから見たアウトラインビュー
メソッドの織り込みの順序を階層表示


織り込みの情報をそれぞれの視点に応じて提供
織り込みを行うリバイザ
(Repainter)のアウトラインビュー 織り込みが行われるメソッド
(Shapeクラスのsetメソッド)
最初に織り込みを行うメソッド
(RepainterリバイザのGUI処理)
9
二番目に織り込みを行うメソッド
(Timerリバイザのタイマー処理)
現在の実装

Eclipseプラグインとして開発




10
Eclipseのコードを読んだ量:約10000行
コード量:約2000行
JDT(Java Development Tools)のアウトラインビューを拡張
実行時に織り込みが行われるメソッドを列挙
織り込み順のあいまいさ検出


織り込み順で全体の挙動が変わる
@Require


各リバイザの織り込み順の優先順位を指定
本システムが検出
@Reviser
@Require(Timer.class)
class Repainter {
…
Timerを先に適用
優先順位を指定しない
}
エラー箇所を
色を変えて表示
11
@Reviser
@Require(Repainter.class)
class Timer {
…
矛盾
Repainterを先に適用
優先順位を指定しない
} 順序があいまい
デモ

実際に本システムを実装したアウトラインビューをお見
せします
12
関連研究

AJDT(AspectJ Development Tools)[The Eclipse Foundation]


AspectJ開発を支援するツール
アスペクトの視点から、他のアスペクトの情報を知ることがで
Shape
きない
Repainter
setX
GUI
Shape
Timer Timer

代入
setY
ShapeRepainter
代入
setX
setY
GUI
Code Bubbles[Andrew ら ‘10]


13
視点によって表示する内容を変更
エディタ(bubble)で表示
GUI
GUI
Timer
まとめと今後の課題

まとめ




プログラムの織り込み関係を表示するアウトラインビュー
視点に応じて切り替える
Eclipseプラグインとして開発
今後の課題


GluonJ開発を支援するツールとして完成
評価

14
実際に使用してもらい、ビューの切り替えを行う回数を調べる