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

アスペクト指向プログラミング（Aspect Oriented Programming、AOP）は、を実装する手法によって、プログラムのモジュール性を高めることを目的にしたプログラミングパラダイムである。横断的関心とは、関心の分離によるモジュールの複数以上にまたがっている共通機能を意味している。AOPはこの横断的関心を、既存コードに設けた間接点（joint point）を通しての振る舞い助言（advice）の追加によって、コード変更を伴なわずに実装できるようにしている。任意の間接点および振る舞い助言の定義をまとめたモジュールがと呼ばれ、これが横断的関心の表現体になる。例としては、全ての関数呼出しにログ出力を伴わせたい時に、全関数冒頭にjoint pointを設けてログ出力コードをadviceにしたアスペクトをプログラム内に定義することで、自動的に各関数呼出しとログ出力が同時実行されるようになる。

アスペクト指向は本来、命令型プログラミングの一角を占めるパラダイムであり、オブジェクト指向とは異なる視点で命令型を発展させたの一種でもある。状態の遷移がプロセスに影響を与える命令型の特性（プログラム副作用）に加えて、サブジェクト指向はプロセスもsubjectに基づいた遷移対象にしている。オブジェクト指向は、状態とプロセスの抽象化を追求したパラダイムなので、プロセスの具象/抽象を問わずにaspectに基づいた遷移対象にできるアスペクト指向と直交している。

しかし現状のアスペクト指向は、オブジェクト指向のコードをサポートする役割に留まっていることが多く、独立したパラダイムとして扱われることは稀である。OOP言語JavaにAOPを追加した「AspectJ」がその代表例である。純粋OOP言語RubyもAOP由来の機能を補完的に取り入れているModule#prependによってCLOS（Common Lisp Object System）のaround hookと同じように，あるメソッドの前後をフックして処理を行えるようになりました。これは以前注目されていた「アスペクト指向プログラミング」に近い振る舞いになります。https://gihyo.jp/news/report/01/rubykaigi2017/0002。

 主なアスペクト指向言語 
 Aspect C++
 Aspect J
 Aspect R
 Aspect L


 主なアスペクト指向フレームワーク 
 JBoss AOP
Aspect Cocoa
 Aspect Werkz
 Spring Framework
 Seasar

 主なアスペクト指向準拠のプロダクト 
 Bugdel - アスペクト指向を使用したデバッグコードの挿入
 WhiteDog System - ネットワーク共有機能の挿入
 Association Aspects - アスペクト指向言語の拡張
 MergeDoc Project: Pleiades Eclipse - プラグイン日本語化プラグイン
 Active Template Library - ATLにおけるCOMのインスタンス生成方法・スレッド安全性・アパートメントの制御を特徴として分離、柔軟な組み合わせを実現させる
 脚注 

 関連項目 
 関心の分離

*
Category:アスペクト指向開発
Category:プログラミングパラダイム