スライド 1

アスペクトのコメントをクラスの
コメントに織り込む AspectJ 用
の改良 Javadoc の提案
堀江 倫大 千葉 滋
東京工業大学
API (Application Programming Interface)
ドキュメント

ライブラリ・フレームワークの開発時に作成
 閲覧する利用者
一般ユーザー:公開 API のドキュメント
 開発者自身:private なメンバの API も含む



仕様変更などの際
一般的には、ドキュメント作成ツールを使用
 Javadoc
など
Javadoc の使用例
1.
2.
メソッドの仕様をコメントの形で記述
Javadoc が HTML ファイルを自動生成
class Stack {
:
/** スタックの先頭にあるオブジェクトを
* を取り出します。…
* @exception EmptyStackException
* スタックが空の場合
*/
Object peek() {
if (size () == 0)
throw new EmptyStackException();
return elementAt(size() – 1);
}
}
API ドキュメント(HTML ファイル)
アスペクト指向プログラミング
(AOP) による開発

横断的関心事をアスペクトとして分離可能
 例)キャッシング、トランザクション、例外処理
 AspectJ


代表的な AOP 言語のひとつ
用途
 ライブラリの内部実装

公開 API からは見えない
 フレームワークの公開

API
抽象アスペクトとして公開

ユーザーがオーバーライドして使用
etc.
問題

実装に合わせてコメントも分離すると、API ド
キュメントをうまく統合する方法がない
例外に関するアスペクト
class Stack {
:
/** @exception EmptyStackException
* スタックのサイズが0のとき
*/
if (size () == 0)
throw new EmptyStackException();
/** スタックのトップを見る。
*/
Object peek() {
return elementAt(size() – 1);
}
}
API ドキュメント作成
?
妥協策

公開クラス側にアスペクトを考慮したコメント
を一緒に記述してしまう
 Stack.peek()
のコメント + 例外に関するコメント
モジュール性の低下

仕様変更の際、アスペクトが影響を及ぼす
API のコメントを編集する必要
いくつもの API に影響を与えている可能性
 API の仕様変更はよくあること

/** スタックのトップを見る。 */
/** @exception EmptyStackException
* スタックのサイズが0のとき */
提案: コメントも AOP で扱える
AspectJ 用改良 Javadoc

API コメントのための AOP
 ジョインポイント、ポイントカット、アドバイスを定義
 アスペクトが及ぼす影響を正確に
API ドキュメン
トに反映することが可能
 API ドキュメント生成時、本ツールがJavadoc の
実行プログラムにコメントを織り込む

ドメイン固有言語(DSL)
 宣言的で簡潔したコメントの記述
本ツールの織り込みの動き

Javadoc の実行プログラムに、コメント出力
のためのアスペクトを織り込む
: Javadoc の実行プログラム
ClassDecl clazz = …;
print(clazz.getComment());
:
FieldDecl fld = …;
print(fld.getComment());
:
MethodDecl meth = …;
print(meth.getComment());
:
Stack.peek() のコメント
例外に関するアスペクトのドキュメント出力
print(“/**” +
“@exception EmptyStackException” +
“スタックのサイズが0のとき” +
“*/“);
コメント用ジョインポイントモデル

クラス、メソッド、フィールドの API ドキュメント
生成時
A×B→X
(ABX model [Masuhara ら ‘03])
A: クラスのドキュメントを出力するプログラム
B: アスペクトのドキュメントを出力するプログラム
X: 実行中の Javadoc

Javadoc のプログラムにアスペクトのコメント
を織り込むためのもの
コメント用のポイントカット、アドバイス

ポイントカット
 コメント用ジョインポイントの集合

アドバイス
コメントを Javadoc の実行プログラムに織り
込む処理
 API

アドバイスの中身
/** と */ で囲まれた文章と
Javadoc タグ(@param、@exception など)
 コメント用ジョインポイントの直後に織り込まれる
暗黙のポイントカット

対応するアドバイスが織り込まれるジョインポ
イントのコメントを選択
class Stack {
:
/** スタックのトップを見る。
*/
Object peek() {
return elementAt(size() – 1);
}}
/** @exception EmptyStackException
* スタックのサイズが0のとき
*/
before() : execution(Object Stack.peek()) {
if (size () == 0)
throw new EmptyStackException();
}
API ドキュメント
暗黙のポイントカット その2

記述量の軽減
ポイントカット:
呼び出し側のメソッド
(foo)のコメントを選択
 execution ポイントカット:
呼び出される側のメソッド
(bar)のコメントを選択
 抽象ポイントカット:
無視
 call
/** …/***/… */
execution(void
call(void B.var())
B.var())
class A {
/** … */
void foo () {
B.var();
}
}
class B {
/** … */
static void
bar() { … }
}
ジョインポイントの追加

コメントの織り込み先の追加
 呼び出し側(pop)メソッドへの影響を反映
class Stack {
:
/** スタックからひとつ取り出す */
Object pop() {
Object obj = peek();
:
}
/** スタックのトップを見る */
Object peek() {
return elementAt(size() – 1);
}
}
aspect StackChecking {
/** @caller()
*
@exception EmptyStackException
*
スタックのサイズが0のとき
*/
before() : execution(Object Stack.peek()) {
if (size () == 0)
throw new EmptyStackException();
}}
ジョインポイントの追加 その2

各織り込み先に異なるコメントを記述
 呼ばれる側(peek)メソッドと、呼び出す側(pop)メソッド
ではドキュメントを変えるべきときがある
aspect StackChecking {
/** @callee
*
if the caller classes are in <tt>java.util</tt> package.
*
@exception EmptyStackException スタックのサイズが0のとき
* @caller (within(java.util.*))
*
@exception EmptyStackException スタックのサイズが0のとき
*/
before() : call(Object Stack.peek()) && within(java.util.*) {
if (size () == 0)
throw new EmptyStackException();
}}
peek メソッド
のドキュメント
へ
pop メソッド
などのドキュ
メントへ
java.util パッケージ内のクラスから peek
が呼び出されたときのみ例外に関する処理
コメントのモジュール分割

ポイントカットとアドバイスのコメントの分割
aspect StackChecking {
/** @callee
*
if the caller is the classes in <tt>java.util</tt> package.
* @caller (within(java.util.*))
*/
pointcut peek() : call(Object Stack.peek()) && within(java.util.*);
/** @exception EmptyStackException スタックのサイズが0のとき */
before() : peek() {
if (size () == 0)
throw new EmptyStackException();
}}
Ajdoc
AspectJ 用のドキュメント作成ツール
 本ツールとは異なる立場に立つ

 対応するアドバイスが織り込まれるジョインポイン
トのコメントのみに追加
アドバイスの織り込み箇所 = コメントの追加箇所
 仕様変更のときなどに private なメンバーの API を参
照したりすると便利

 公開 API
ドキュメントに十分にアスペクトの影響
を反映させられない
関連研究

アスペクトの影響を理解しやすくするための
表現形式・ツールの提案
 Aspect-Aware

「AOP には OOP とは異なる新しいインターフェース
AAI が存在する 」
 open

modules
AOP の能力を制限するための規則を言語に導入
 Crosscutting

Interface (AAI) [Kiczales ら ‘05]
Programming Interface (XPI)
拡張可能なジョインポイントをインターフェースに提示
まとめ・今後の課題

API コメントのための AOP の提案
ジョインポイント、ポイントカット、アドバイスを定義
 アスペクトの及ぼす影響を正確に API ドキュメン
トに反映することが可能
 API ドキュメント生成時、本ツールがJavadoc の
実行プログラムにコメントを織り込む


今後の課題
 評価方法の検討