「アスペクト指向プログラミング」の版間の差分
表示
削除された内容 追加された内容
Aki42006AWB (会話 | 投稿記録) "脚注"節を挿入 using AWB |
編集の要約なし タグ: 差し戻し済み ビジュアルエディター |
||
(同じ利用者による、間の2版が非表示) | |||
1行目: | 1行目: | ||
[[ファイル:W3sDesign Dependency Injection Design Pattern UML.jpg|境界|右|フレームなし|265x265ピクセル]] |
|||
'''アスペクト指向プログラミング'''(アスペクトしこうプログラミング、Aspect Oriented Programming、'''AOP''')は、[[オブジェクト指向]]ではうまく分離できない特徴(クラス間を横断 (cross-cutting) するような機能)を「[[アスペクト]]」とみなし、[[アスペクト記述言語]]をもちいて分離して記述することでプログラムに柔軟性をもたせようとする試みで、極端に言えば、あるプログラムFの本質とは無関係だが使うかもしれないプログラムGを、プログラムFを実行したときに割り込ませるような機能である。このプログラムGこそがアスペクトであり、これを別ファイルに分離し、処理系が[[ディスパッチ]]することで、プログラムF以外を実行するときにもプログラムGを割り込ませることができる。 |
|||
{{プログラミング・パラダイム}} |
|||
'''アスペクト指向プログラミング'''({{lang-en-short|''Aspect Oriented Programming''}}:略称 '''AOP''')は、[[関心の分離]](''separation of concerns'')と{{仮リンク|横断的関心事|en|Cross-cutting concern|label=}}(''cross-cutting concern'')を直交させる設計と実装を目的にした[[プログラミング|コンピュータプログラミング]]のための手法またはスタイルである。ここでの関心とはプログラム内での一つの機能責任を表わしているデータとコードの複合体である[[モジュール]]を指し、分離とは適切なモジュール分割を指す。横断的関心事とはモジュールの[[凝集度|高凝集]]と[[結合度|疎結合]]を追求しても切り離しが困難で各モジュール間に散在せざる得ない重複パートを指す。この重複パートを特殊なモジュール化したものがアスペクトであり、アスペクトは[[コンパイラ]]によってプログラムの随所に織り込まれる。 |
|||
アスペクトの例としては、データ転送帯域の制限や例外の処理などがある。[[Java]]にアスペクト指向的要素を追加した[[AspectJ]]が実験的に実装されている。 |
|||
[[オブジェクト |
AOPは「[[Common Lisp Object System]]」が備えていた動的ジェネリック関数の[[ミックスイン]]がルーツである。[[MIT]]から「[[Smalltalk]]」の発祥地[[ゼロックスPARC]]に移籍して、[[CLOS]]の設計思想を[[The Art of the Metaobject Protocol|メタオブジェクトプロトコル]]の名で体系化していた計算機科学者{{仮リンク|グレゴール・キザーレス|en|Gregor Kiczales|label=}}たちによってそのコンセプトが構築されたという理由から、AOPは[[オブジェクト指向プログラミング|オブジェクト指向]]に深く関連付けられている。メタオブジェクトプロトコルの方は[[プロトタイプベース]]OOPのルーツになっている。ゼロックスPARCから発表された「[[AspectJ|Aspect J]]」がAOPの代表的言語実装と見なされている。「[[Ruby]]」にもAOPを補完的に取り入れた言語実装がある<ref>{{Cite web|url=https://xtech.nikkei.com/it/article/COLUMN/20070725/278238/|title=まつもと直伝 プログラミングのオキテ 第0回 あらためてRuby入門(基本と他言語との違い)|accessdate=2020/12/18|publisher=日経クロステック}}</ref><ref><code>Module#prepend</code>によってCLOS(CommonLisp Object System)のaround hookと同じように,あるメソッドの前後をフックして処理を行えるようになりました。これは以前注目されていた「アスペクト指向プログラミング」に近い振る舞いになります。https://gihyo.jp/news/report/01/rubykaigi2017/0002</ref>。 |
||
⚫ | |||
⚫ | |||
* [[AspectC++]] |
|||
== 来歴 == |
|||
⚫ | |||
⚫ | |||
⚫ | |||
* [[AspectL]] |
|||
* [[ |
* [[AspectC++|Aspect C++]] |
||
⚫ | |||
⚫ | |||
⚫ | |||
* {{仮リンク|e (IEEE 1647)|en|E_(verification_language)}} |
* {{仮リンク|e (IEEE 1647)|en|E_(verification_language)}} |
||
== |
== アスペクト指向採用フレームワーク == |
||
* Aspect cocoa |
|||
* [[Aspectcocoa]] |
|||
* Aspect Werkz |
|||
* [[AspectWerkz]] |
|||
*JBoss AOP |
|||
* [[Spring Framework]] |
* [[Spring Framework]] |
||
* [[Seasar]] |
* [[Seasar]] |
||
⚫ | |||
⚫ | |||
* Joinpoint |
|||
* Advice |
|||
* Pointcut |
|||
== 脚注 == |
== 脚注 == |
||
31行目: | 30行目: | ||
== 関連項目 == |
== 関連項目 == |
||
* [[関心の分離]] |
* [[関心の分離]] |
||
*{{仮リンク|横断的関心事|en|Cross-cutting concern|label=}} |
|||
== 外部リンク == |
== 外部リンク == |
||
⚫ | |||
'''アスペクト指向が取り入れられている主なプロダクト''' |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
{{プログラミング言語の関連項目}} |
|||
{{Comp-stub}} |
|||
{{DEFAULTSORT:あすへくとしこうふろくらみんく}} |
{{DEFAULTSORT:あすへくとしこうふろくらみんく}} |
||
[[Category:アスペクト指向プログラミング|*]] |
[[Category:アスペクト指向プログラミング|*]] |
2021年1月29日 (金) 04:23時点における版
プログラミング・パラダイム |
---|
アスペクト指向プログラミング(英: Aspect Oriented Programming:略称 AOP)は、関心の分離(separation of concerns)と横断的関心事(cross-cutting concern)を直交させる設計と実装を目的にしたコンピュータプログラミングのための手法またはスタイルである。ここでの関心とはプログラム内での一つの機能責任を表わしているデータとコードの複合体であるモジュールを指し、分離とは適切なモジュール分割を指す。横断的関心事とはモジュールの高凝集と疎結合を追求しても切り離しが困難で各モジュール間に散在せざる得ない重複パートを指す。この重複パートを特殊なモジュール化したものがアスペクトであり、アスペクトはコンパイラによってプログラムの随所に織り込まれる。
AOPは「Common Lisp Object System」が備えていた動的ジェネリック関数のミックスインがルーツである。MITから「Smalltalk」の発祥地ゼロックスPARCに移籍して、CLOSの設計思想をメタオブジェクトプロトコルの名で体系化していた計算機科学者グレゴール・キザーレスたちによってそのコンセプトが構築されたという理由から、AOPはオブジェクト指向に深く関連付けられている。メタオブジェクトプロトコルの方はプロトタイプベースOOPのルーツになっている。ゼロックスPARCから発表された「Aspect J」がAOPの代表的言語実装と見なされている。「Ruby」にもAOPを補完的に取り入れた言語実装がある[1][2]。
特徴
来歴
代表的なアスペクト指向言語
- Aspect C++
- Aspect J
- Aspect R
- Aspect L
- e (IEEE 1647)
アスペクト指向採用フレームワーク
- Aspect cocoa
- Aspect Werkz
- JBoss AOP
- Spring Framework
- Seasar
脚注
- ^ “まつもと直伝 プログラミングのオキテ 第0回 あらためてRuby入門(基本と他言語との違い)”. 日経クロステック. 2020年12月18日閲覧。
- ^
Module#prepend
によってCLOS(CommonLisp Object System)のaround hookと同じように,あるメソッドの前後をフックして処理を行えるようになりました。これは以前注目されていた「アスペクト指向プログラミング」に近い振る舞いになります。https://gihyo.jp/news/report/01/rubykaigi2017/0002
関連項目
外部リンク
- Bugdel -- アスペクト指向を使用したデバッグコードの挿入
- WhiteDog System[リンク切れ] -- ネットワーク共有機能の挿入
- Association Aspects: 連想アスペクト -- アスペクト指向言語の拡張
- MergeDoc Project Pleiades: -- Eclipse プラグイン日本語化プラグイン
- ATL の概念 -- Active Template LibraryにおけるCOMのインスタンス生成方法・スレッド安全性・アパートメントの制御を特徴として分離、柔軟な組み合わせを実現させる