「アスペクト指向プログラミング」の版間の差分
Aki42006AWB (会話 | 投稿記録) "脚注"節を挿入 using AWB |
m Bot作業依頼#Cite webの和書引数追加 |
||
(7人の利用者による、間の11版が非表示) | |||
1行目: | 1行目: | ||
'''アスペクト指向プログラミング'''(Aspect Oriented Programming、'''AOP''')は、{{仮リンク|横断的関心|en|Cross-cutting concern|label=}}を実装する手法によって、プログラムの[[モジュール性]]を高めることを目的にした[[プログラミングパラダイム]]である。横断的関心とは、[[関心の分離]]による[[モジュール]]の複数以上にまたがっている共通機能を意味している。AOPはこの横断的関心を、既存コードに設けた間接点(joint point)を通しての振る舞い助言(advice)の追加によって、コード変更を伴なわずに実装できるようにしている。任意の間接点および振る舞い助言の定義をまとめたモジュールが{{仮リンク|アスペクト(AOP)|en|Aspect (computer programming)|label=アスペクト}}と呼ばれ、これが横断的関心の表現体になる。例としては、全ての関数呼出しにログ出力を伴わせたい時に、全関数冒頭にjoint pointを設けてログ出力コードをadviceにしたアスペクトをプログラム内に定義することで、自動的に各関数呼出しとログ出力が同時実行されるようになる。 |
|||
'''アスペクト指向プログラミング'''(アスペクトしこうプログラミング、Aspect Oriented Programming、'''AOP''')は、[[オブジェクト指向]]ではうまく分離できない特徴(クラス間を横断 (cross-cutting) するような機能)を「[[アスペクト]]」とみなし、[[アスペクト記述言語]]をもちいて分離して記述することでプログラムに柔軟性をもたせようとする試みで、極端に言えば、あるプログラムFの本質とは無関係だが使うかもしれないプログラムGを、プログラムFを実行したときに割り込ませるような機能である。このプログラムGこそがアスペクトであり、これを別ファイルに分離し、処理系が[[ディスパッチ]]することで、プログラムF以外を実行するときにもプログラムGを割り込ませることができる。 |
|||
アスペクト指向は本来、[[命令型プログラミング]]の一角を占めるパラダイムであり、[[オブジェクト指向プログラミング|オブジェクト指向]]とは異なる視点で[[命令型プログラミング|命令型]]を発展させた{{仮リンク|サブジェクト指向|en|Subject-oriented programming}}の一種でもある。状態の遷移がプロセスに影響を与える命令型の特性([[副作用 (プログラム)|プログラム副作用]])に加えて、サブジェクト指向はプロセスもsubjectに基づいた遷移対象にしている。[[オブジェクト指向プログラミング|オブジェクト指向]]は、状態とプロセスの[[抽象化 (計算機科学)|抽象化]]を追求したパラダイムなので、プロセスの具象/抽象を問わずにaspectに基づいた遷移対象にできるアスペクト指向と直交している。 |
|||
アスペクトの例としては、データ転送帯域の制限や例外の処理などがある。[[Java]]にアスペクト指向的要素を追加した[[AspectJ]]が実験的に実装されている。 |
|||
[[オブジェクト指向プログラミング]] |
しかし現状のアスペクト指向は、[[オブジェクト指向プログラミング|オブジェクト指向]]のコードをサポートする役割に留まっていることが多く、独立した[[プログラミングパラダイム|パラダイム]]として扱われることは稀である。OOP言語[[Java]]にAOPを追加した「[[AspectJ]]」がその代表例である。純粋OOP言語[[Ruby]]<ref>{{Cite web|和書|url=https://xtech.nikkei.com/it/article/COLUMN/20070725/278238/|title=まつもと直伝 プログラミングのオキテ 第0回 あらためてRuby入門(基本と他言語との違い)|accessdate=2020/12/18|publisher=日経クロステック}}</ref>もAOP由来の機能を補完的に取り入れている<ref><code>Module#prepend</code>によってCLOS(CommonLisp Object System)のaround hookと同じように,あるメソッドの前後をフックして処理を行えるようになりました。これは以前注目されていた「アスペクト指向プログラミング」に近い振る舞いになります。https://gihyo.jp/news/report/01/rubykaigi2017/0002</ref>。 |
||
== 主なアスペクト指向言語 == |
== 主なアスペクト指向言語 == |
||
* [[AspectC++]] |
* [[AspectC++|Aspect C++]] |
||
* [[AspectJ]] |
* [[AspectJ|Aspect J]] |
||
* [[AspectR]] |
* [[AspectR|Aspect R]] |
||
⚫ | |||
* [[AspectL]] |
|||
* [[JBossAOP]] |
|||
* {{仮リンク|e (IEEE 1647)|en|E_(verification_language)}} |
* {{仮リンク|e (IEEE 1647)|en|E_(verification_language)}} |
||
== 主なアスペクト指向フレームワーク == |
== 主なアスペクト指向フレームワーク == |
||
* JBoss AOP |
|||
* [[Aspectcocoa]] |
|||
*Aspect Cocoa |
|||
* [[AspectWerkz]] |
|||
* Aspect Werkz |
|||
* [[Spring Framework]] |
* [[Spring Framework]] |
||
* [[Seasar]] |
* [[Seasar]] |
||
⚫ | |||
== 用語 == |
|||
⚫ | |||
⚫ | |||
⚫ | |||
* Joinpoint |
|||
⚫ | |||
* Advice |
|||
⚫ | |||
* Pointcut |
|||
⚫ | |||
== 脚注 == |
== 脚注 == |
||
{{脚注ヘルプ}} |
{{脚注ヘルプ}} |
||
31行目: | 31行目: | ||
== 関連項目 == |
== 関連項目 == |
||
* [[関心の分離]] |
* [[関心の分離]] |
||
*{{仮リンク|横断的関心|en|Cross-cutting concern|label=}} |
|||
*{{仮リンク|ジョインポイント|en|Join point}} |
|||
== 外部リンク == |
|||
*{{仮リンク|ポイントカット|en|Pointcut}} |
|||
⚫ | |||
*{{仮リンク|アドバイス(AOP)|en|Advice (programming)|label=アドバイス}} |
|||
⚫ | |||
*{{仮リンク|アスペクト(AOP)|en|Aspect (computer programming)|label=アスペクト}} |
|||
⚫ | |||
*{{仮リンク|アスペクトウィーバー|en|Aspect weaver}} |
|||
⚫ | |||
{{Normdaten}}{{プログラミング言語の関連項目}} |
|||
⚫ | |||
⚫ | |||
⚫ | |||
{{DEFAULTSORT:あすへくとしこうふろくらみんく}} |
{{DEFAULTSORT:あすへくとしこうふろくらみんく}} |
||
[[Category:アスペクト指向プログラミング|*]] |
[[Category:アスペクト指向プログラミング|*]] |
||
[[Category:アスペクト指向開発]] |
[[Category:アスペクト指向開発]] |
||
[[Category:プログラミングパラダイム]] |
[[Category:プログラミングパラダイム]] |
||
⚫ |
2023年10月6日 (金) 11:47時点における最新版
アスペクト指向プログラミング(Aspect Oriented Programming、AOP)は、横断的関心を実装する手法によって、プログラムのモジュール性を高めることを目的にしたプログラミングパラダイムである。横断的関心とは、関心の分離によるモジュールの複数以上にまたがっている共通機能を意味している。AOPはこの横断的関心を、既存コードに設けた間接点(joint point)を通しての振る舞い助言(advice)の追加によって、コード変更を伴なわずに実装できるようにしている。任意の間接点および振る舞い助言の定義をまとめたモジュールがアスペクトと呼ばれ、これが横断的関心の表現体になる。例としては、全ての関数呼出しにログ出力を伴わせたい時に、全関数冒頭にjoint pointを設けてログ出力コードをadviceにしたアスペクトをプログラム内に定義することで、自動的に各関数呼出しとログ出力が同時実行されるようになる。
アスペクト指向は本来、命令型プログラミングの一角を占めるパラダイムであり、オブジェクト指向とは異なる視点で命令型を発展させたサブジェクト指向の一種でもある。状態の遷移がプロセスに影響を与える命令型の特性(プログラム副作用)に加えて、サブジェクト指向はプロセスもsubjectに基づいた遷移対象にしている。オブジェクト指向は、状態とプロセスの抽象化を追求したパラダイムなので、プロセスの具象/抽象を問わずにaspectに基づいた遷移対象にできるアスペクト指向と直交している。
しかし現状のアスペクト指向は、オブジェクト指向のコードをサポートする役割に留まっていることが多く、独立したパラダイムとして扱われることは稀である。OOP言語JavaにAOPを追加した「AspectJ」がその代表例である。純粋OOP言語Ruby[1]もAOP由来の機能を補完的に取り入れている[2]。
主なアスペクト指向言語
[編集]- Aspect C++
- Aspect J
- Aspect R
- Aspect L
- 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のインスタンス生成方法・スレッド安全性・アパートメントの制御を特徴として分離、柔軟な組み合わせを実現させる
脚注
[編集]- ^ “まつもと直伝 プログラミングのオキテ 第0回 あらためてRuby入門(基本と他言語との違い)”. 日経クロステック. 2020年12月18日閲覧。
- ^
Module#prepend
によってCLOS(CommonLisp Object System)のaround hookと同じように,あるメソッドの前後をフックして処理を行えるようになりました。これは以前注目されていた「アスペクト指向プログラミング」に近い振る舞いになります。https://gihyo.jp/news/report/01/rubykaigi2017/0002