Get Slide

第13回プログラミングおよびプログラミング言語ワークショップ(PPL2011)
Kide: 開発環境による
オブジェクト指向言語での
アスペクト指向開発の支援
東京工業大学
金澤 圭 堀江 倫大 千葉 滋
プログラミング言語を用いたモジュール化

言語機構により、ファイル単位に機能を分割

例. オブジェクト指向

クラス単位、継承
関心事A
A関連の機能
int x
char c
int x
char c
hoge(..)
bar(..)
hoge(..)
hoge(..)
bar(..)
入力
同期
入力
入力
同期
ソート
出力
ソート
ソート
出力
出力
出力
出力
2
int x
B関連の機能
オブジェクト指向言語を用いたモジュール化の例
描画エディタを関心事(機能)ごとにモジュール化
見方によってはモジュール化されていない



Shape
横断的関心事
Circle
Shape
3
Circle
int x
int y
setX(x)
setY(y)
int r
Rectangle
Rectangle
int w
int h
setRadius(r)
setWidth(w)
setHeight(h)
r Log
w Log
h Log
x代入
y代入
r代入
w代入
h代入
描画
描画
描画
描画
描画
アスペクト指向(AOP)
ファイル間をまたがって実装された関心事を
アスペクトモジュールに分離できる


AspectJ による図形エディタの実装
Logging
r Log
w Log
h Log
Shape
Circle
int x
int y
setX(x)
setY(y)
int r
Rectangle
int w
int h
setRadius(r)
setWidth(w)
setHeight(h)
r Log
w Log
h Log
Repainter
描画
4
x代入
y代入
r代入
w代入
h代入
描画
描画
描画
描画
描画
言語機構によるモジュール化の問題点
複数の関心事に属すプログラム断片の扱いに困る


AOP は部分的な解である
(言語の習得)

Logging
r Log
w Log
h Log
Shape
Circle
int x
int y
setX(x)
setY(y)
int r
Rectangle
int w
int h
setRadius(r)
setWidth(w)
setHeight(h)
r Log
w Log
h Log
Repainter
描画
5
x代入
y代入
r代入
w代入
h代入
描画
描画
描画
描画
描画
提案: Kide on IDE (統合開発環境)
対話的なプログラムのモジュール化を支援



対話的な切り替えにより、常に最適な視点で編集可能
メソッドをグループ化
ドキュメントのモジュール化


プログラムと文書とをまたがる擬似的なモジュールも生成可
Concern View
Repainter
 setRadius(..)
 setWidth(..)
 setHeight(..)
Logging
 setRadius(..)
 setWidth(..)
6
KideEdito
r
これは
setRadius(r)
setWidth()
setWidth(w)
の説明..
setHeight(h)
setWidth(w)
LogsetWidth(w)
Log
Log
Log
r代入
w代入
w代入
h代入
w代入
描画
描画
描画
描画
Readme
Circle
int
r
これは
Rectangle
setRadius(r)
クラスの説明..
Log
これは
setWidth()
の説明..
r代入
..
描画
Rectangle
int w
setWidth(w)
int h
setHeight(h)
Log
w代入
h代入
描画
描画
Kide の関心事の定義方法
GUI を用いて定義する

7
関心事の一括定義
呼び出し関係
メソッドのオーバーライド関係


8
定義した関心事の使用方法
Concern ビューアから Kide エディタを起動
関心事に対して一括修正



9
メソッドの冒頭、(メソッドの最後 / return 文の前)
ドキュメントのモジュール化

プログラムと文書とをまたがる擬似的なモジュールも生
成可能

10
Readme のようなチュートリアル、レビューシート
Kide を用いたソフトウェア開発例

保守改良時の開発ワークフロー


レビュー
課題の報告、検討、修正サイクル
Javassist の開発に Kide を用いるなら

設計
開発・
テスト
メモリ消費量が大きすぎるとの不具合報告



11
プラン
情報破棄を実行する prune メソッドを追加
prune メソッドを実行した後は、クラス定義の変更を許さない
クラス定義を変更するメソッドの冒頭に checkModify メソッドの追加
コードレビュー
プラン
Kide を用いた開発・テスト

レビュー
情報破棄を実行する prune メソッドの追加

pruning という関心事を定義し、一覧表示で確認
設計
開発・
テスト
Concern View
pruning
 toBytecode(..)
 prune(..)
 ..
needCheckModify
 addMethod(..)
 remMethod(..)
 setName(..)
 setModifiers(..)
 ..
12
Review
JASSIST-28
に関する修正
は以下の通り
JASSIST29…
CtClassType
addMethod
CtClass
setName
@ pruning
toBytecode
class file
書込
method
追加
remMethod
name
代入
setModifiers
prune
prune
filed
代入
..
method
除去
set
Flag
prune
プラン
Kide を用いた開発・テスト

レビュー
開発・
テスト
クラス定義を変更するメソッドの冒頭に
checkModify メソッドの追加

関心事 needCheckModfy を定義し、 checkModify メソッドを一
斉挿入
Concern View
pruning
 toBytecode(..)
 prune(..)
 ..
needCheckModify
 addMethod(..)
 remMethod(..)
 setName(..)
 setModifiers(..)
 ..
13
Review
JASSIST-28
に関する修正
は以下の通り
JASSIST29…
..
CtClassType
addMethod
CtClass
setName
check
Modify
check
Modify
method
追加
name
代入
remMethod
設計
setModifiers
check
Modify
check
Modify
method
除去
set
Flag
プラン
Kide を用いたコードレビュー

レビュー
プログラムの断片を利用した報告書の作成
設計
開発・
テスト
@ review
JASSIST-28
に関する修正
は以下の通り
prune
filed
代入
Concern View
pruning
 toBytecode(..)
 prune(..)
 ..
needCheckModify
 addMethod(..)
 remMethod(..)
 setName(..)
 setModifiers(..)
 ..
14
Review
JASSIST-28
に関する修正
は以下の通り
JASSIST29…
..
CtClassType
addMethod
CtClass
setName
prune
addMethod
check
Modify
check
Modify
check
Modify
method
追加
name
代入
method
追加
remMethod
setModifiers
remMethod
check
Modify
check
Modify
check
Modify
method
除去
set
Flag
method
除去
AOP 言語を使う場合

ModifyChecking アスペクトを別のソースファイルに定義



AOP 言語ではポイントカットを使用し、関心事を定義



閲覧性は向上する
checkModify メソッドを呼び出している側の可読性は低下
開発者は AOP 言語特有の文法を覚える必要
コードが正しい場所に織り込まれているかの確認が困難
プログラムと文書の両方にまたがる関心事は対応不可
15
Kide が有用な場合/AOP 言語が有用な場合

Kide


保守改良時に用いる際に有用性が高い
AOP 言語

16
ソフトウェア開発が始まったばかりの段階で、横断的関心事を
捉えられ、アスペクトとして実装することを決定できるのであ
れば有用性が高い
関連研究: アスペクト指向

言語機構によるモジュール化支援
class Shape {..
int x, y;
void setX(..) {
this.x = x;
Screen.repaint();
}.. class Circle ext. Shape {
}
int r;
void setR(..) {
this.r = r;
Screen.repaint();
}
class Rectangle ext. Shape { ..
}
void setWidth(..) {..
Screen.repaint();
}
void setHeight(..) {..
Screen.repaint();
}
17
}
aspect Repainter {
after():execution(void set*(..)) {
Screen.repaint();
}
}
関連研究: 開発環境の機構によるモジュール化

AJDT(+ AspectJ)

織り込まれるアドバイスを IDE が表示



AspectJ の可読性の問題を解消
編集作業はファイル間を行き来する必要がある
Fluid AOP [Hon ら’07]

アスペクト指向の利点を IDE によって生み出す


18
3種類の Editable Viewer
AOP の知識が多少必要である
関連研究: 開発環境の機構によるモジュール化

Code Bubbles



bubble としてプログラム断片を表示、細かい粒度での編集可
多くの関心事を定義するための支援がない
AOP の利点を提供することを目的としていない


コードの一括挿入などの機能はない
Colored IDE



19
エディタ上で Feature ごとに色を付ける
AST に対して Feature を関連付ける
言語に依存する
関連研究: 開発環境の機構によるモジュール化

Mylar [Kersten ら ‘05]

タスクごとにモジュール化



20
モジュール化の指標は degree-of-interest(DOI) に基づく
DOI が高いものを優先的にビューア上に表示させる
エディタ上に特別な機能はない
まとめと今後の課題

まとめ

OOP の開発環境で AOP の利点を提供し、プログラムの対話
的なモジュール化を支援する Kide を提案し、Eclipse プラグイ
ンとして実装を行った。




一度決めたプログラム分割とは異なる視点からの編集が可能
異なる言語間、異なる文書間にまたがる関心事もモジュール化可
IDE として提供し、特別な知識を習得する必要がない
今後の課題



21
評価を行う
一括挿入機能の強化
UI をより直感的にする