コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「アスペクト指向プログラミング」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
編集の要約なし
G000001 (会話 | 投稿記録)
オブジェクト指向プログラミングとは直交する(排他的ではなく、相補的な関係にある)という有用と思われる記述が削除されている/AOPのルーツはCLOSのmixinではない/MOPはプロトタイプ指向のルーツではない/ので記述を修正するため、手動で版を復帰(2020年12月27日 (日) 05:42)しました。
1行目: 1行目:
'''アスペクト指向プログラミング'''(アスペクトしこうプログラミング、Aspect Oriented Programming、'''AOP''')は、[[オブジェクト指向]]ではうまく分離できない特徴(クラス間を横断 (cross-cutting) するような機能)を「[[アスペクト]]」とみなし、[[アスペクト記述言語]]をもちいて分離して記述することでプログラムに柔軟性をもたせようとする試みで、極端に言えば、あるプログラムFの本質とは無関係だが使うかもしれないプログラムGを、プログラムFを実行したときに割り込ませるような機能である。このプログラムGこそがアスペクトであり、これを別ファイルに分離し、処理系が[[ディスパッチ]]することで、プログラムF以外を実行するときにもプログラムGを割り込ませることができる。
[[ファイル:W3sDesign Dependency Injection Design Pattern UML.jpg|境界|右|フレームなし|265x265ピクセル]]
{{プログラミング・パラダイム}}


アスペクトの例としては、データ転送帯域の制限や例外の処理などがある。[[Java]]にアスペクト指向的要素を追加した[[AspectJ]]が実験的に実装されている。
'''アスペクト指向プログラミング'''({{lang-en-short|''Aspect Oriented Programming''}}:略称 '''AOP''')は、[[関心の分離]](''separation of concerns'')と{{仮リンク|横断的関心事|en|Cross-cutting concern|label=}}(''cross-cutting concern'')を直交させる設計と実装を目的にした[[プログラミング|コンピュータプログラミング]]のための手法またはスタイルである。ここでの関心とはプログラム内での一つの機能責任を表わしているデータとコードの複合体である[[モジュール]]を指し、分離とは適切なモジュール分割を指す。横断的関心事とはモジュールの[[凝集度|高凝集]]と[[結合度|疎結合]]を追求しても切り離しが困難で各モジュール間に散在せざる得ない重複パートを指す。この重複パートを特殊なモジュール化したものがアスペクトであり、アスペクトは[[コンパイラ]]によってプログラムの随所に織り込まれる。


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>。
[[オブジェクト指向プログラミング]]とは直交する(排他的はなく、相補的な関係ある)[[プログラミングパラダイム]]である。つまり既存のプログラミングパラダムを置き換えるもではく、あくまで既存の言語の補助機能して利用されることを目的としている。例として、本格なオブジェクト指向言語」を謳う<ref>{{Cite web|url=https://xtech.nikkei.com/it/article/COLUMN/20070725/278238/|title=まつもと直伝 プログラミングのオキテ 第0回 あらためてRuby入門(基本と他言語との違い)|accessdate=2020/12/18|publisher=日経クロステック}}</ref>プログラミング言語[[Ruby]]でも、アスペクト指向に影響を受けた機能を補完的に取り入れている<ref><code>Module#prepend</code>によってCLOS(CommonLisp Object System)のaround hookと同じように,あるメソッドの前後をフックして処理を行えるようになりました。これは以前注目されていた「アスペクト指向プログラミング」に近い振る舞いになります。https://gihyo.jp/news/report/01/rubykaigi2017/0002</ref>。


== なアスペクト指向言語 ==
== 特徴 ==
* [[AspectC++]]

* [[AspectJ]]
== 来歴 ==
* [[AspectR]]

* [[AspectL]]
== 代表的なアスペクト指向言語 ==
* [[AspectC++|Aspect C++]]
* [[JBossAOP]]
* [[AspectJ|Aspect J]]
* [[AspectR|Aspect R]]
* Aspect L
* {{仮リンク|e (IEEE 1647)|en|E_(verification_language)}}
* {{仮リンク|e (IEEE 1647)|en|E_(verification_language)}}


== アスペクト指向採用フレームワーク ==
== 主なアスペクト指向フレームワーク ==
* [[Aspectcocoa]]
* Aspect cocoa
* [[AspectWerkz]]
* Aspect Werkz
*JBoss AOP
* [[Spring Framework]]
* [[Spring Framework]]
* [[Seasar]]
* [[Seasar]]

== 用語 ==
* Aspect
* Joinpoint
* Advice
* Pointcut


== 脚注 ==
== 脚注 ==
30行目: 31行目:
== 関連項目 ==
== 関連項目 ==
* [[関心の分離]]
* [[関心の分離]]
*{{仮リンク|横断的関心事|en|Cross-cutting concern|label=}}


== 外部リンク ==
== 外部リンク ==
* [https://web.archive.org/web/20070430030838/http://www.csg.is.titech.ac.jp/projects/bugdel/ Bugdel] -- アスペクト指向を使用したデバッグコードの挿入
'''アスペクト指向が取り入れられている主なプロダクト'''
* [https://web.archive.org/web/20070430030838/http://www.csg.is.titech.ac.jp/projects/bugdel/ Bugdel] アスペクト指向を使用したデバッグコードの挿入
* [http://untrod.keihanna.ne.jp/whitedog/ WhiteDog System]{{リンク切れ|date=2018年3月 |bot=InternetArchiveBot }} -- ネットワーク共有機能の挿入
* [http://untrod.keihanna.ne.jp/whitedog/ WhiteDog System]{{リンク切れ|date=2018年3月 |bot=InternetArchiveBot }} ネットワーク共有機能の挿入
* [https://web.archive.org/web/20060321033931/http://www.komiya.ise.shibaura-it.ac.jp/~sakurai/aa/index_jp.html Association Aspects: 連想アスペクト] -- アスペクト指向言語の拡張
* [https://web.archive.org/web/20060321033931/http://www.komiya.ise.shibaura-it.ac.jp/~sakurai/aa/index_jp.html Association Aspects: 連想アスペクト] アスペクト指向言語の拡張
* [http://mergedoc.sourceforge.jp/ MergeDoc Project] Pleiades: -- Eclipse [http://www.eclipsewiki.net/eclipse/?%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3%C6%FC%CB%DC%B8%EC%B2%BD%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3 プラグイン日本語化プラグイン]
* [http://mergedoc.sourceforge.jp/ MergeDoc Project] Pleiades: Eclipse [http://www.eclipsewiki.net/eclipse/?%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3%C6%FC%CB%DC%B8%EC%B2%BD%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3 プラグイン日本語化プラグイン]
* [http://msdn.microsoft.com/ja-jp/library/3ax346b7(VS.80).aspx ATL の概念] -- Active Template LibraryにおけるCOMのインスタンス生成方法・スレッド安全性・アパートメントの制御を特徴として分離、柔軟な組み合わせを実現させる
* [http://msdn.microsoft.com/ja-jp/library/3ax346b7(VS.80).aspx ATL の概念] Active Template LibraryにおけるCOMのインスタンス生成方法・スレッド安全性・アパートメントの制御を特徴として分離、柔軟な組み合わせを実現させる

{{プログラミング言語の関連項目}}


{{Comp-stub}}
{{DEFAULTSORT:あすへくとしこうふろくらみんく}}
{{DEFAULTSORT:あすへくとしこうふろくらみんく}}
[[Category:アスペクト指向プログラミング|*]]
[[Category:アスペクト指向プログラミング|*]]

2021年2月28日 (日) 04:48時点における版

アスペクト指向プログラミング(アスペクトしこうプログラミング、Aspect Oriented Programming、AOP)は、オブジェクト指向ではうまく分離できない特徴(クラス間を横断 (cross-cutting) するような機能)を「アスペクト」とみなし、アスペクト記述言語をもちいて分離して記述することでプログラムに柔軟性をもたせようとする試みで、極端に言えば、あるプログラムFの本質とは無関係だが使うかもしれないプログラムGを、プログラムFを実行したときに割り込ませるような機能である。このプログラムGこそがアスペクトであり、これを別ファイルに分離し、処理系がディスパッチすることで、プログラムF以外を実行するときにもプログラムGを割り込ませることができる。

アスペクトの例としては、データ転送帯域の制限や例外の処理などがある。Javaにアスペクト指向的要素を追加したAspectJが実験的に実装されている。

オブジェクト指向プログラミングとは直交する(排他的ではなく、相補的な関係にある)プログラミングパラダイムである。つまり既存のプログラミングパラダイムを置き換えるものではなく、あくまで既存の言語の補助機能として利用されることを目的としている。例として、「本格的なオブジェクト指向言語」を謳う[1]プログラミング言語Rubyでも、アスペクト指向に影響を受けた機能を補完的に取り入れている[2]

主なアスペクト指向言語

主なアスペクト指向フレームワーク

用語

  • Aspect
  • Joinpoint
  • Advice
  • Pointcut

脚注

  1. ^ まつもと直伝 プログラミングのオキテ 第0回 あらためてRuby入門(基本と他言語との違い)”. 日経クロステック. 2020年12月18日閲覧。
  2. ^ Module#prependによってCLOS(CommonLisp Object System)のaround hookと同じように,あるメソッドの前後をフックして処理を行えるようになりました。これは以前注目されていた「アスペクト指向プログラミング」に近い振る舞いになります。https://gihyo.jp/news/report/01/rubykaigi2017/0002

関連項目

外部リンク

アスペクト指向が取り入れられている主なプロダクト