アスペクト指向プログラミング(AOP)とは
アスペクト指向プログラミング(Aspect Oriented Programming, AOP)は、プログラムの
モジュール性を向上させることを目的とした
プログラミングパラダイムです。AOPの核心は、横断的関心を効果的に扱うことにあります。
横断的関心とは
横断的関心とは、プログラムの複数の
モジュールにまたがって存在する共通の機能や関心のことを指します。例えば、ログ出力、セキュリティチェック、トランザクション管理などが該当します。これらの機能は、単一の
モジュールに閉じ込めることが難しく、プログラム全体に散在しがちです。
AOPによる横断的関心の実装
AOPでは、横断的関心を実装するために、以下の要素を使用します。
間接点(joint point): プログラムの実行中に特定の処理が実行される場所。例えば、メソッドの呼び出し、オブジェクトの生成などが該当します。
振る舞い助言(advice): 間接点に対して実行される処理。ログ出力、セキュリティチェックなどが該当します。
アスペクト(aspect): 間接点と振る舞い助言をまとめて定義したモジュール。横断的関心の実装単位となります。
AOPでは、既存のコードに直接変更を加えることなく、アスペクトをプログラムに追加することで、横断的関心を実装できます。これにより、コードの重複を避け、保守性を高めることができます。
AOPの例
例えば、全ての関数呼び出しに対してログを出力したい場合、AOPを使用すると、各関数にログ出力コードを記述する必要はありません。代わりに、アスペクトとして、関数呼び出しを間接点とし、ログ出力処理を振る舞い助言として定義します。これにより、プログラム実行時に自動的にログが出力されるようになります。
AOPは本来、命令型プログラミングの一角を占めるパラダイムであり、オブジェクト指向とは異なる視点で命令型を発展させたサブジェクト指向の一種でもあります。命令型プログラミングでは、プログラムの状態遷移がプロセスに影響を与えますが、サブジェクト指向では、プロセスもsubjectに基づいて遷移の対象とします。
オブジェクト指向プログラミング(OOP)は、状態とプロセスの抽象化を追求したパラダイムです。一方でAOPは、プロセスの具象/抽象に関わらず、aspectに基づいた遷移対象にすることができます。このため、AOPとOOPは直交する関係にあります。ただし、現状では、AOPはOOPのコードをサポートする役割を担うことが多く、独立したパラダイムとして扱われることは少ないです。
AOPの現状
現実的には、AOPはオブジェクト指向言語のコードを補完する役割にとどまることが多いです。例えば、Javaにおける「AspectJ」は、Java言語にAOPの概念を取り入れた代表的な例です。また、純粋OOP言語であるRubyも、AOP由来の機能を補完的に取り入れています。
主なアスペクト指向関連技術
アスペクト指向言語
Aspect C++
AspectJ
AspectR
AspectL
e (IEEE 1647)
アスペクト指向フレームワーク
JBoss AOP
Aspect Cocoa
Aspect Werkz
Spring Framework
Seasar
アスペクト指向準拠のプロダクト
Bugdel: アスペクト指向を使用したデバッグコードの挿入
WhiteDog System: ネットワーク共有機能の挿入
Association Aspects: アスペクト指向言語の拡張
MergeDoc Project: Pleiades Eclipse: プラグイン日本語化プラグイン
Active Template Library: ATLにおけるCOMのインスタンス生成方法、スレッド安全性、アパートメントの制御を特徴として分離し、柔軟な組み合わせを実現
関連用語
関心の分離: プログラムを独立した機能に分割する原則
横断的関心: 複数の
モジュールにまたがる共通の機能
ジョインポイント: プログラム実行中の特定の場所
ポイントカット: ジョインポイントの集合を指定する仕組み
アドバイス: ジョインポイントに対して実行される処理
アスペクト: ジョインポイントとアドバイスをまとめた
モジュール
*
アスペクトウィーバー: アスペクトをプログラムに適用するツール
まとめ
AOPは、横断的関心を効果的に扱い、プログラムの
モジュール性を向上させる強力なツールです。
オブジェクト指向プログラミングと併用することで、より柔軟で保守性の高いコードを開発することができます。現状ではOOPを補完する役割が多いですが、AOPの概念は今後も重要な役割を担うと考えられます。