アスペクトのコメントをクラスの コメントに織り込む 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 2025 ExpyDoc