アスペクト指向プログラミング(AOP)は、現在の多数のアプリケーション要件を解決するために利用できます。Eclipse FoundationのAspectJ(記事・英語)は、人気の高いAOP実装です。しかしこの技術を使って仕事を始めようとする初心者ユーザーがおじけづいてしまう可能性があります。新しい記事の中でAJDTプロジェクトのリードを務めるMatt Chapman氏は、EclipseのAspectJ Development Tools(AJDT)プラグインを使ってAspectJ開発がどのように容易になるかを示します。AspectJに関する詳細は、InfoQのAspectJタグ(source)をご覧ください。
読者の皆さんがEclipseのAspectJ Development Tools(AJDT)を使わずにAspectJ開発をしている場合、今回の記事は皆さんに欠けているものを示してくれます。AJDTを以前に使ったことがある人でも、知らなかった機能に出会うかもしれません。
ますます多くの開発者が現代のIDEに見られる高度な機能に依存するようになっています。私たちの多くがEmacsかViでのプログラミングを間違いなく覚えている(皆さんの中にはいまだ使っている人も絶対いると思います)一方で、一部の開発者にとって、コンテンツアシストのような機能は不可欠となっています。IDEなしで適度なアプリケーションを記述できない人であれば、このCtrl+Space世代の一員であることは間違いありません。
AspectJのような言語でのアスペクト指向プログラミングは、強大な力とモジュール性の改善を提供しますが、適切なツールがなければ包含性が落ちかねません。一部の単独のJava(tm)コードを見て、ある程度その役目を理解することはできますが、AspectJを使うと、何らかのアドバイスが適用され、全体像が分からない場合があります。トレーシングなどの一部の横断的な関心事の場合、その関心事に気づいていなくてもかまわないことがありますが、例えばセキュリティまたはドメインに特化した関心事の場合、それらがアプリケーションにとって中心的な部分である場合があります。したがってOOPと比較するとAOPに関して高度なIDEサポートを持つ方がより有益なのです。
この記事全体にわたり、AJDTの特色の一部を詳しく取り上げ、AJDTがどのように生産性を高め、AOP手法から得られるメリットを増大させられるかを示します。
エディタにおける横断
それではまず単純なエディタにおいてJavaコードを少し見てみましょう。
それではこれをEclipse Javaエディタと比較しましょう。
シンタックスのカラーリングを除いた主な違いは、エディタの左側と右側にあるマーカーです。右の小さなバーは概要マーカーで、ソースファイル全体において左側のマーカーが生じる場所を示します(そしてその場所にナビゲートするよう選択することが可能)。左側のマーカーはアドバイスマーカーで、特定のソース場所がbefore ()、 after ()、 または around () アドバイスに影響されていることを示しています。
上記のスクリーンショットでは、paint()メソッド内の2行がbeforeアドバイスに影響されていることが分かります。paint()メソッド自体の実行もアドバイスに影響されています。一般的なアドバイスマーカーアイコンである () は、アドバイスタイプを組み合わせたものが1つのソース場所に影響していることを示すのに使われます。
アドバイスマーカーの上で止まると、追加情報を示すツールチップを見ることができます。またその上で右クリックすると、"Advised By"メニューが現れ、アドバイスの定義にナビゲートしてくれます。上記のようなマーカーを併用しているケースでは、以下のように"Advised By"メニューには2つの項目があり、メソッドがbeforeとafterアドバイスの両方に影響されていることを示します。
AspectJエディタ
AspectJはJavaの拡張であり、Eclipseの規約は、純粋なJavaコードを.javaファイルに保持し(AspectJプロジェクトであっても)、AspectJに特化したコンストラクトを使うソースに関しては.aj拡張子を使うということです。例えば新しいアスペクトは.ajファイルで作成されます。つまりJavaエディタはデフォルト設定では依然として.javaファイル、AspectJエディタは.ajファイル用に使われるということです。このエディタはJavaエディタの拡張であるため、Javaコードにも使うことができます。
ここではエディタでアスペクトを開いています。
AspectJエディタは、Javaコードに対するJavaエディタのふるまいと同等にAspectJコードに対してふるまうよう設計されています。例えばシンタックスのカラーリングは、execution、around、proceedなどのAspectJキーワードにまで及びます。Organize Imports、Add Import、Formatなど、他のエディタ操作は同様に働きます。
Ctrl+Spaceでの支援
コンテンツアシスト(コード補完とも呼ばれる)の重要性については先ほど述べました。AspectJエディタはアスペクトで定義されたメソッド内、およびアドバイスブロック(シンタックスの面でメソッドと似ている)内でJavaベースの補完を提供します。例えばアドバイスパラメータに対して補完できます。
上記の場所でCtrl+Spaceを押すと、ローカル変数であるlocation、アドバイスパラメータである mon
と ticks
、特殊なAspectJ変数である thisJointPoint
と thisJointPointStaticPart
、アスペクトでのプライベートな静的フィールドであるmonitorMap
、Object
から継承したメソッドなどの補完リストが出てきます。
アスペクトはまた、別のクラスのためにフィールドおよびメソッドを宣言することもできます。これらはインタータイプ宣言として知られており、異なるコンテンツアシストによる補完を必要とします。
ここでの囲ってあるアスペクトは、PointクラスのためにhasListenersと呼ばれるメソッドを定義しています。したがって任意の場所で提供されるコード補完は、定義しているアスペクトではなくPointクラスのコンテキストにおいて行われます。
AJDTはテンプレート提案も出してくれます。例えば”pc”と入力してCtrl+Spaceを押すと、ポイントカット宣言のテンプレートを挿入することができます。
赤い波線が教えてくれる
Javaエディタのもう1つの貴重な機能は、入力の途中で赤い波線によりエラーを示してくれる点です。AspectJエディタはアスペクトでのJavaコンストラクト、そしてAspectJに特化したシンタックスに関して(若干の制約はありますが)も同様にエラーを示します。赤い下線の上で止まると、追加情報を示すツールチップが示されます。
Outlineビュー
Eclipseの標準的なOutlineビューは、現行のドキュメントの構造を示します。アスペクトの構造はクラスの構造と似通っています。以下に示すとおり、新しい種類のノードはアスペクト、ポイントカット、アドバイス、インタータイプ宣言、Declareステートメントなのです。様々な形のアイコンを使って、可視性を示します。アドバイスの場合、アドバイスへの動的なテストがあるかどうかを示します(つまり完全な一致をコンパイル時間に判断できないとき)。アスペクトはまた、通常のフィールドとメソッドも含みます。クラスの場合と同様、この構造は入力の途中でポピュレートされ(エディタでの保存は不要)、パッケージエクスプローラでソースファイルを拡張することにより見ることが可能です。
アドバイスデコレータ
Javaエレメント(例:フィールドまたはメソッド)がEclipseビューで示されているときはいつでも、どの種類のエレメントかとその可視性を示すアイコンが添えられています。さらにイメージデコレータがAJDTによって提供されており、どのエレメントがアドバイスによって影響されているかを示します。以下にあるとおり、エレメントの左にある小さなオレンジの三角形で示されており、main、foo、barメソッドがここではアドバイスされています。
このイメージデコレータは、JavaエレメントがEclipseビューで示されているときは常に使われています。これはAJDTが提供するビューに加え、Outlineビュー、Package Explorer、Java BrowsingパースペクティブからのMembersビューを含みます。
Cross Referencesビュー
これまで、エディタマーカーを追加してアドバイスされたエレメントを飾ることにより、AJDTがAspectJの横断的な性質をどのように示すのかを見てきました。これらのメカニズムは、シームレスに追加情報を提供するため、既存のビューとエディタと連携するよう設計されています。しかしこれらはいわば処理能力が低いメカニズムで、複数のアドバイスブロックが同じ場所に影響を与えた場合や、ソースファイルに影響するすべてのアドバイスの概要が必要な場合などに、詳細な情報を常に十分提供するわけではありません。
ここでCross Referencesビューの出番です(ときには“X-Ref”と略されます)。AJDTを使い始めたときに自動で開くはずです。またはWindow > Show View > Other...と選択したあとで、AspectJカテゴリーから選択することで、マニュアルで開くことができます。もちろん、ビューを好きなように任意のパースペクティブに配置できますが、出発点としてOutlineビューの下にCross Referencesビューを配置するようにしてください。あるいは、配置済みのクイックアウトラインビューのみを使う場合、通常はCtrl+Oを押すのですが、Navigateメニューから、またはAlt-Shift-Pを押してCross Referencesビューを出しても同じことができます(すべてのショートキーバインディングはすでに使われているのです)。
"Cross References"という名称はやや一般的な名前ですが、それはこのビューが汎用的なものであり、アクティブなエディタで選択されている現行のエレメントに関連する情報を示すよう拡張できるためです。AJDTでは、現行のエレメントに関する横断的な関係を示すよう構成されています。
VisualiserCanvas.javaソースファイルに関して、アドバイスマーカーがエディタに追加されている先ほどの例に戻ってみましょう。これらのマーカーはアドバイスの存在を示しており、もう少し情報を示すためにコンテキストメニューを使うことが可能です。しかしこの場合余分なアクションが必要となりますし、常に詳しい情報が得られるわけではありません。Cross Referencesビューがpaintメソッドに関して示している内容は次のとおりです。
ここでは、paintメソッド自体がbeforeおよびafterアドバイスによってアドバイスされており、メソッド内のエレメントがアドバイスされていることも分かります。Image.dispose()に対するメソッドコールは、beforeアドバイスによって、Imageコンストラクタコールは他のbeforeアドバイスによって、いずれもRenderingMonitorInfoアスペクトからアドバイスされています。
このビューが皆さんのJavaパースペクティブに組み込まれると、この詳細な横断的情報が常に一目見ただけで分かるようになります。ビューはエディタおよびOutlineビューでの選択物に対応するため、デフォルト設定により現行のエレメントに関連する情報が常に示されます。ビューのツールバー上にあるボタンにより、必要に応じてこのリンクを無効にすることができます。また現行のエレメントだけでなくファイル全体の横断的情報を示すボタンもあります。
Incremental compilation
高度なIDEを利用することから得られる最大の生産性の1つは、編集‐コンパイル‐実行‐デバッグのサイクルをめぐるのにかかる時間を短縮できるということです。Eclipseの増分的なJavaコンパイラは皆さんの編集に基づいて必要な部分のみを再コンパイルすることに長けているので、単純な変更であれば、コンパイルの手順は瞬く間に起きるのでほとんど分からないくらいです。AJDTで使われるAspectJコンパイラはEclipse Javaコンパイラに基づいており、目的も同じく効率のよさを目指しています。このプロセスは、AspectJの持つ横断的な性質によってより複雑になっていますが、クラスとアスペクトの両方に対して最も単純な変更をかけると、迅速な増分的コンパイルが行われます。インライン化されているポイントカットまたはアドバイスなどに対する変更には、完全なビルドを必要とするものがあります。
@AspectJ
これまで、aspect、pointcut、beforeなどの言語に関するキーワードを使ってアスペクトが.ajファイルで宣言されるコードスタイルのアスペクトを見てきました。AspectJは、@AspectJスタイルとして知られているアノテーションスタイルの宣言もサポートしています。この宣言では、通常のクラス・メソッドがJava 5アノテーションと組み合わされて用いられます。例えば、pointcutというキーワードを使う代わりに、メソッドはポイントカットという名称で作成され、これが次に@Beforeというアノテーションで印を付けられます。アノテーションの値は主要なポイントカットの表現式である文字列となります。
AJDTはこの@AspectJスタイルをサポートします。Cross Referencesビューは依然として横断的な関係を示し、マーカーがやはりエディタで示されます。Add Import操作はAspectJで定義されるアノテーションにおいて役立ち、入力の途中でエラーを示す機能は基本的なシンタックスにおいて役立ちます。ただしこれはアノテーションで使われる文字列の内容までカバーしません。それがこの宣言スタイルの欠点の1つですが、ソースファイルが保存・コンパイルされたあとで、少なくともエラーが赤い下線とツールチップで示されます。
実践
AJDTをEclipseにインストールする最も簡単な方法は、Update Siteを定義することです(Help > Software Updates > Find and Install...を使う)。更新サイトの厳密なURLについては、AJDT Downloadページ(サイト・英語)をご覧ください。Eclipseの以前のバージョンだけでなく最新のEclipseリリース向けのAJDTのリリースビルドがあります。また最新の機能を実際に使ってみたい場合、または最新のEclipseのマイルストンについてサポートが必要な場合、開発ビルドが頻繁に発表されています。
適切なウィザードまたはツールバーアイコンを使って新しいAspectJプロジェクトを作成することができます。あるいは、Package Explorerビューからプロジェクトを右クリックし、コンテキストメニューからAspectJ Tools > Convert to AspectJ Projectを選択することによって、Javaプロジェクトを変換することができます。新しいクラスおよびパッケージなどを作成するのは、Javaプロジェクトの場合と同じであり、新しいアスペクトの作成についてはNew Aspectウィザードがあります。
ビルトインの事例
AJDTは、参考までにいくつかのプロジェクト例をバンドルし、それらプロジェクト例を皆さんの仕事場にインポートするための単純なウィザードも提供しています。今回の記事に出てきたスクリーンショットの多くは、これらのプロジェクト例を使っています。ツールバーのNewボタンを単に押すか、File > New > Other...を選択して次にAspectJカテゴリーを展開します。利用できる例は2つのサブカテゴリーに分かれています。まずAspectJ事例はコンパイラの配布からのサンプルプロジェクトを含んでおり、AspectJ Programming Guideの第3章で取り上げられています。2つ目のサブカテゴリーはAspectJプラグイン事例です。これは最近追加されたもので、Eclipseプラグインを開発する際のアスペクトの使用方法を示すことを目的としています。AJDT 1.4の時点で、このカテゴリーには1つしか事例がありませんが、今後のリリースではもっと多くが追加されるはずです。Progress Monitor Checkerと呼ばれる現在の事例は、Eclipse進捗モニタを使ったプラグインがAPIの求める規則に従っているかどうかテストするためのアスペクトの使用方法を示しており、Eclipse Cornerの記事で説明されています。
まとめ
今回の記事では、アスペクトの開発を支援するためAspectJエディタがどのように高度な機能を提供し、マーカーとCross Referencesビューがどのように詳細な情報を示し、アプリケーションの横断的構造のナビゲーションをサポートするかを見てきました。増分的コンパイルにより、開発プロセスの効率が改善する上、AspectJコンパイラが通常のバイトコードを生成するためEclipse Javaデバッガを依然として用いることができます(aroundアドバイスにおいてブレークポイントを設定するには、AspectJコンパイラ設定でインライニングをオフにする必要があります)。AJDTはまた、ロード時間ウィービングの起動構成、アスペクト視覚化パースペクティブ、横断的比較ツール、アスペクトライブラリの開発・利用についてのサポート、そしてAspectJ対応のEclipseプラグインの開発に関連する機能など、今回の記事の範囲外のより高度な機能も提供します。
デモ、新機能、ダウンロードおよびAJDTニュースグループに関する詳細を含め、何か疑問があれば、AJDTサイト(サイト・英語)にアクセスしてください。AJDTは、オープンソースのEclipse.orgツールプロジェクトであり、EPLの条件のもとリリースされています。
著者について
Matt Chapman氏はIBMの英国Hursley Labに勤めるソフトウェアエンジニアであり、Eclipse.org でAJDTプロジェクトを指揮しています。このプロジェクトでは、開発者がAOPから最大限の利益を享受できるような統合開発環境を構築しています。MattはEclipseConやAOSDなどの会議に定期的に出席しています。
JavaおよびJavaをベースとしたすべての商標ならびにロゴは、米国、他国、またはその両方においてSun Microsystems, Inc.の商標または登録商標です。
Copyright © 2006 International Business Machines Corp.
(このArticleは2006年11月21日にリリースされました)