アスペクトのコメントをクラスの
コメントに織り込む 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 の
実行プログラムにコメントを織り込む
今後の課題
評価方法の検討
© Copyright 2026 ExpyDoc