ももの知恵の樹

アスペクト指向プログラミング

アスペクト指向プログラミングとは

アスペクト指向(Aspect-oriented)とは

アスペクト指向とは、横断的な関心事を分離して独立させることで、モジュールの独立性を高めるプログラミングパラダイムです。
簡単に言えば、散在する共通処理を抜き出し、それを一つにまとめて管理できるようにする手法及び概念となります。
これには、コードの再利用性、可読性、保守性を向上させることができる利点があります。

アスペクト指向における"アスペクト"とは「横断的な関心事」のことを指します。
具体的には、散在する共通処理を抜き出して一つにまとめたモジュールをアスペクトと呼びます。

なお、アスペクト(aspect)とは、「ある事柄や物事の特徴や側面」という意味の英単語です。
動詞としては、継続・反復・完了など、行為の様相という意味になります。


関心事(かんしんじ:Concerns)とは

関心事とは、システムやプログラムが扱うべきタスクや目的・責務・役割などの概念を意味します。
例えば、「ビジネスロジック」「認証」「データアクセス」「ログ出力」などの各機能は、ロジック自体がそれぞれの関心事を形成します。
また、関心事は関心(かんしん)とも呼ばれ、同義に用いられます。

なお、一般的な意味での関心事とは、「気になっている事柄」や「興味のある事柄」という意味です。
ソフトウェア分野における意味は一般用語と離れている点に注意が必要です。


横断的な関心事(Cross-Cutting Concerns)とは

横断とは、ある機能や責任が複数のモジュールやクラスにまたがって存在している状態のことを指します。
例えば、認証やログ出力などのサブロジックが、メインロジックに付随してそれぞれのコードに記述されているような状態を「横断的である」といいます。

つまり、横断的な関心事とは、複数の実装場所から利用される共通機能のことを意味します。
言い換えれば、コンポーネントとして正しく分離するのが難しい関心事のことです。

一般的に、モジュール内に別のモジュールを呼び出す処理が散在してしまうということは、ソフトウェアの保守性を妨げる要因になります。
しかし、これはオブジェクト指向パラダイムで解決できない問題として、長く議論されてきた課題です。


AOPが実装できるプログラミング言語

アスペクト指向のプログラミング言語としては「Aspect C++」「Aspect J(Java)」「Aspect R(Ruby)」などがあります。
また、AOPを採用したフレームワークもあり、有名なのは「Spring Framework」や「Seasar2」です。


AOPの主要な概念

アドバイス(Advice)

アドバイスとは、共通処理を意味します。
具体的には、認証やログ出力、例外処理などの処理であり、これらは指定された注入場所に適用され、特定の動作を追加する役割を果たします。

アドバイスには、主に以下の5種類があります。

アドバイス 説明
Before Advice メソッドの実行前に動作する。
After Advice (メソッドの実行結果に関わらず)メソッドの実行後に動作する。
Around Advice メソッド実行の代わりに(メソッドの実行を包み込むように)動作する。
AfterReturning Advice メソッドが正常終了時に動作する。
AfterThrowing Advice メソッドが例外発生時に動作する。


ジョインポイント(Join Point)とポイントカット(Pointcut)

ジョインポイントとは、共通処理を注入する場所のことです。
つまり、アドバイスが適用される具体的な地点(メソッドの呼び出しやフィールドアクセスなど)を指します。

ポイントカットとは、アドバイスをどのような条件で注入するのかという「注入する条件」を意味します。
つまり、ジョインポイントを選択するための基準や条件を指定することを指します。



アスペクト(Aspect)とウィービング(Weaving)

アスペクトは、AOPにおける基本単位であり、複数のアドバイスやポイントカットをまとめたもののことです。
つまり、横断的な関心事を定義し、その処理をモジュール化する役割を果たします。

ウィービングとは、アスペクトを対象のコードに統合する操作を指します。
ウィービングは、コンパイル時、ロード時、またはプログラム実行時などに行われます。



その他の概念

名前 説明
アドバイサー アスペクトのモジュール化のことです。
アドバイスとポイントカットを兼ね備えたクラスを意味します。
インターセプタ インターセプタとは、メソッドの前後で任意の処理を実行させることができる機能のことです。
横取り・割り込み(インターセプト)して処理を行います。
プロキシ プロキシとは、それぞれの処理の関連付けを行うために、動的クラスを拡張する仕組みのことです。
ターゲット ターゲットとは、ジョインポイントが持つインスタンスのことです。

関連ページ