コンピューティング において、アスペクト指向プログラミング (AOP )は、横断的な関心事 を分離する ことでモジュール性を 高めることを目的としたプログラミングパラダイム です。これは、既存のコードを変更することなく 、既存のコードに動作(アドバイス )を追加することで実現されます。代わりに、「関数名が 'set 'で始まるすべての関数呼び出しをログに記録する 」 といった「ポイントカット」仕様によって、どのコードを変更するかを個別に指定します。これにより 、ビジネスロジック の中心ではない動作(ログ記録など)を、コア機能のコードを煩雑にすることなくプログラムに追加できます。
AOPは、ソースコードレベルでの関心のモジュール化をサポートするプログラミング手法とツールを含みますが、アスペクト指向ソフトウェア開発は、 エンジニアリング分野全体を指します。
アスペクト指向プログラミングでは、プログラムロジックをまとまりのある機能領域(いわゆる関心事 )に分解します。ほぼすべてのプログラミングパラダイムは、これらの関心事を実装、抽象化、構成するために使用できる抽象化(関数、プロシージャ、モジュール、クラス、メソッドなど)を提供することで、関心事をある程度グループ化し、 独立したエンティティにカプセル化することをサポートしています。しかし、プログラム内で複数の抽象化をまたぐ関心事もあり、これらの実装方法では対応できません。このような関心事は、横断的関心事 または水平的関心事と呼ばれます。
ロギングは、 システム全体のログ記録対象部分すべてに影響を与える必要があるため、横断的な関心事の一例と言えます。したがって、ロギングはログ記録対象となるすべてのクラスとメソッドにまたがります 。
すべての AOP 実装には、各関心事を 1 箇所にカプセル化する横断的な式がいくつかあります。実装間の違いは、提供される構成要素のパワー、安全性、および使いやすさにあります。たとえば、型安全性やデバッグのサポートがほとんどない、限定的な形式の横断的表現方法を指定するインターセプターがあります。AspectJに はそのような式が多数あり、それらをアスペクト と呼ばれる特別なクラスにカプセル化しています。たとえば、アスペクトは、ポイントカットと呼ばれる定量化またはクエリ (特定のジョイン ポイントが一致するかどうかを検出する) で指定されたさまざまなジョイン ポイント (プログラム内のポイント) でアドバイス(追加の動作) を適用することにより、ベース コード (プログラムのアスペクト以外の部分) の動作を変更できます。アスペクトは、メンバーや親を追加するなど、他のクラスにバイナリ互換性のある構造変更を行うこともできます。
動機と基本概念 通常、アスペクトはコードとして散在し たり絡み合ったりする ため、理解や保守が困難になります。散在の原因は、ログ記録などの機能が、その 機能を使用する可能性のある、互いに無関係な複数の機能に分散していることです。これらの機能は、全く異なるシステムで動作していたり、異なる言語で記述されていたりする場合もあります。そのため、ログ記録を変更するには、影響を受けるすべてのモジュールを変更する必要が生じる可能性があります。アスペクトは、それが表現されるシステムのメインライン機能だけでなく、アスペクト同士でも絡み合います。したがって、1つの懸念事項を変更するには、絡み合ったすべての懸念事項を理解するか、変更の影響を推測できる何らかの手段が必要となります。
例えば、ある口座から別の口座へ金額を送金する、概念的には非常にシンプルな方法を持つ銀行アプリケーションを考えてみましょう。Javaでのそのような例は次の ようになります。
sealed class BankingException extends Exception permits InsufficientFundsException , UnauthorisedUserException { // ... } public class Bank { public void transfer ( Account fromAcc , Account toAcc , int amount ) throws BankingException { if ( fromAcc . getBalance () < amount ) { throw new InsufficientFundsException (); } fromAcc.withdraw ( amount ) ; toAcc.deposit ( amount ) ; } } しかし、この転送方法では、展開されたアプリケーションが必要とするいくつかの考慮事項が見落とされています。例えば、現在のユーザーがこの操作を実行する権限を持っていることを確認すること、偶発的なデータ損失を防ぐためにデータベーストランザクション をカプセル化すること、診断目的で操作をログに記録することなどです。
これらの新たな懸念事項をすべて盛り込んだバージョンは、おそらく次のようになるでしょう。
import java.util.logging.* ; sealed class BankingException extends Exception permits InsufficientFundsException , UnauthorisedUserException { // ... } public class Bank { private static final Logger logger ; private final Database database ; public void transfer ( Account fromAcc , Account toAcc , int amount , User user ) throws BankingException { logger.info ( " 送金中..." ) ; if ( ! isUserAuthorised ( user , fromAcc )) { logger.log ( Level.WARNING , "ユーザー に 権限がありません。" ) ; throw new UnauthorisedUserException (); } if ( fromAcc.getBalance ( ) < amount ) { logger.log ( Level.WARNING , " 残高不足 です 。 " ) ; throw new InsufficientFundsException ( ); } fromAcc.withdraw ( amount ) ; toAcc.deposit ( amount ) ; database.commitChanges ( ) ; // アトミック操作。 logger.log ( Level.INFO , " トランザクション 成功 。 " ) ; } } この例では、他の関心事が基本的な機能(ビジネスロジックの懸念事項と呼ばれることもある)と 絡み合っ ています。トランザクション、セキュリティ、ログ記録はすべて、横断的な懸念事項 の例です。
では、アプリケーションのセキュリティに関する考慮事項を突然変更する必要が生じた場合を考えてみましょう。プログラムの現在のバージョンでは、セキュリティ関連の操作は多数のメソッドに分散し ており、そのような変更には多大な労力が必要となります。
AOPは、プログラマが横断的な関心事をアスペクト と呼ばれる独立したモジュールで表現できるようにすることで、この問題を解決しようとします。アスペクトには、アドバイス (プログラム内の特定のポイントに結び付けられたコード)と型間宣言 (他のクラスに追加される構造メンバー)を含めることができます。たとえば、セキュリティモジュールには、銀行口座にアクセスする前にセキュリティチェックを実行するアドバイスを含めることができます。ポイントカットは 、銀行口座にアクセスできるタイミング(ジョインポイント )を定義し、アドバイス本体のコードは、セキュリティチェックの実装方法を定義します。このようにして、チェックとアクセスポイントの両方を1か所で管理できます。さらに、優れたポイントカットは、後々のプログラムの変更を予測できるため、別の開発者が銀行口座にアクセスする新しいメソッドを作成した場合、その新しいメソッドが実行されると、アドバイスが適用されます。
上記の例では、アスペクトでログ記録を実装します。
アスペクト ロガー { ロガー ロガー ; void Bank.transfer ( Account fromAcc , Account toAcc , int amount , User user ) { logger.info ( " 送金中 ... " ) ; } void Bank.getMoneyBack ( User user , int transactionId ) { logger.info ( "ユーザー が 返金を要求しました。 " ) ; } // その他の横断的コード。 } AOPはデバッグツールまたはユーザーレベルのツールと考えることができます。アドバイスは、関数を変更できない場合(ユーザーレベル)[ 5 ] 、または本番コードで関数を変更したくない場合(デバッグ)に限定して使用する必要があります。
ジョイントポイントモデル アスペクト指向言語のアドバイス関連コンポーネントは、ジョイントポイントモデル(JPM)を定義します。JPMは次の3つのことを定義します。
アドバイスが実行可能な場合、これらはジョインポイント と呼ばれます。これは、実行中のプログラム内で、追加の動作を効果的に結合できるポイントだからです。ジョインポイントが有用であるためには、通常のプログラマーがアクセス可能で理解できる必要があります。また、アスペクトの安定性を維持するために、プログラムの些細な変更に対しても安定している必要があります。多くのAOP実装では、メソッドの実行とフィールド参照をジョインポイントとしてサポートしています。 結合点を指定(または定量化 )する方法をポイントカット と呼びます。ポイントカットは、指定された結合点が一致するかどうかを判定します。最も有用なポイントカット言語は、基本言語と同様の構文を使用し(例えば、AspectJは Javaシグネチャを使用)、命名と組み合わせによって再利用を可能にします。 ジョインポイントで実行するコードを指定する手段。AspectJでは これをアドバイス と呼び、ジョインポイントの前、後、周辺で実行できます。一部の実装では、別のクラスのアスペクトでメソッドを定義することもサポートしています。 ジョイントポイントモデルは、公開されているジョイントポイント、ジョイントポイントの指定方法、ジョイントポイントで許可されている操作、および表現可能な構造的拡張機能に基づいて比較できます。
AspectJのジョイントポイントモデルAspectJにおけるジョインポイントには、メソッドまたはコンストラクタの呼び出しまたは実行、クラスまたはオブジェクトの初期化、フィールドの読み書きアクセス、および例外ハンドラが含まれます。ループ、スーパークラスの呼び出し、throws句、または複数のステートメントは含まれません。 ポイントカットは、プリミティブなポイントカット指定子 (PCD)の組み合わせによって指定されます。「カインド」PCDは、特定の種類のジョインポイント(メソッド実行など)に一致し、多くの場合、Javaライクなシグネチャを入力として受け取ります。そのようなポイントカットの1つは次のようになります。 setメソッド名が「 」で始まり、任意の型の引数がちょうど 1 つある場合、このポイントカットはメソッド実行の結合点と一致します。
「動的」PCDは実行時型をチェックし、変数をバインドします。たとえば、
このポイントカットは、現在実行中のオブジェクトがクラスのインスタンスである場合に一致しますPoint。なお、クラスの修飾されていない名前は、Javaの通常の型検索で使用できます。
「スコープ」PCDは、結合点の語彙的範囲を制限します。例:
このポイントカットは、パッケージ内のあらゆる型の任意の結合点に一致しますcom.company。これ* は、1つのシグネチャで多くのものに一致させるために使用できるワイルドカードの形式の一つです。
ポイントカットは、再利用できるように構成および命名できます。例:
pointcut set () : execution ( * set * ( * ) ) && this ( Point ) && within ( com . company . * ); setこのポイントカットは、メソッド名が「 」で始まり、パッケージ内のthis型のインスタンスである 場合、メソッド実行ジョインポイントと一致します。「 」という名前を使用して参照できます。Pointcom.companyset()Adviceは、特定のコード(メソッド内のコードのように指定)を、ジョインポイント(ポイントカットで指定)の前、後、またはその周辺で実行するように指定します。AOPランタイムは、ポイントカットがジョインポイントと一致すると、Adviceを自動的に呼び出します。例: after () : set ( ) { Display.update ( ); } これは実質的に「ポイントカットが結合点と一致する場合、結合点の処理が完了した後にset() コードを実行する」ことを指定している。Display.update()
その他の潜在的なジョイントポイントモデル JPMには他にも種類があります。すべてのアドバイス言語は、そのJPMによって定義できます。例えば、UML 用の架空のアスペクト言語は、次のようなJPMを持つかもしれません。
接合点はすべてモデル要素です。 ポイントカットとは、モデル要素を組み合わせたブール式のことです。 これらのポイントにおける影響の手段は、一致するすべての接合点の視覚化である。
型間宣言 型間宣言は、 モジュールの構造に影響を与える横断的な関心事を表現する方法を提供します。オープンクラス や拡張メソッド とも呼ばれるこの宣言により、プログラマーは、通常、関心事に関連するすべてのコードを1つのアスペクトにまとめるために、別のクラスのメンバーまたは親を1か所で宣言できます。たとえば、プログラマーが横断的な表示更新の関心事をビジターを使用して実装した場合、ビジターパターン を使用した型間宣言は、AspectJでは次のようになります。
aspect DisplayUpdate { void Point . acceptVisitor ( Visitor v ) { v . visit ( this ); } // その他の横断的コード... } このコードスニペットは、クラスacceptVisitorにメソッドを追加しますPoint。
構造的な追加は、既存のクラスのクライアントが引き続き動作するように、元のクラスと互換性がある必要があります。ただし、AOPの実装が常にすべてのクライアントを制御できると想定できる場合はこの限りではありません。
実装 AOPプログラムは、基盤となる言語や環境に応じて、他のプログラムに2つの異なる方法で影響を与える可能性があります。
結合されたプログラムが生成され、それは元の言語で有効であり、最終的なインタプリタにとっては通常のプログラムと区別がつかない。 最終的なインタプリタまたは環境は、AOP機能を理解し実装できるように更新されます。 環境変更の難しさから、ほとんどの実装では、ウィービング と呼ばれるプログラム変換 手法を用いて互換性のある組み合わせプログラムを生成します。アスペクトウィーバーは 、アスペクト指向コードを読み込み、アスペクトを統合した適切なオブジェクト指向コードを生成します。同じAOP言語でも様々なウィービング手法で実装できるため、言語のセマンティクスをウィービングの実装方法だけで判断すべきではありません。組み合わせ方法によって影響を受けるのは、実装の速度と展開の容易さだけです。
システムは、プログラムのソースファイルへのアクセスを必要とするプリプロセッサを使用して、ソースレベルのウィービングを実装できます(C++ は当初CFront で実装されていました)。しかし、Java の明確に定義されたバイナリ形式により、バイトコードウィーバーは .class ファイル形式のあらゆる Java プログラムで動作できます。バイトコードウィーバーは、ビルドプロセス中、またはウィーブモデルがクラスごとの場合はクラスロード中にデプロイできます。AspectJは2001 年にソースレベルのウィービングから始まり、2002 年にクラスごとのバイトコードウィーバーを提供し、2005 年に AspectWerkz を統合した後は、高度なロード時サポートを提供するようになりました。
実行時にプログラムを結合するソリューションは、プログラマの分離モデルを維持するために、それらを適切に分離するビューを提供する必要があります。Java のバイトコードによる複数ソースファイルのサポートにより、デバッガはソースエディタで適切に結合された .class ファイルをステップ実行できます。ただし、一部のサードパーティ製逆コンパイラは、サポートされているすべてのバイトコード形式ではなく、Javac によって生成されたコードを想定しているため、結合されたコードを処理できません (下記の§ 批判 も参照)。
デプロイ時の ウィービングは別のアプローチを提供します。[ 6 ] これは基本的にポストプロセスを意味しますが、生成されたコードにパッチを適用するのではなく、このウィービングアプローチでは既存のクラスをサブクラス化して、メソッドのオーバーライドによって変更を導入します。既存のクラスは実行時にも変更されず、開発中はデバッガやプロファイラなどの既存のツールをすべて使用できます。同様のアプローチは、 IBM のWebSphere など、多くのJava EE アプリケーションサーバーの実装ですでに実証されています。
用語 アスペクト指向プログラミングで使用される標準的な用語には、以下のようなものがあります。
横断的な懸念事項 オブジェクト指向モデルのほとんどのクラスは単一の特定の機能を実行しますが、多くの場合、他のクラスと共通の二次的な要件を共有します。たとえば、データアクセス層内のクラスと、スレッドがメソッドに出入りするたびに UI 層のクラスにログ記録を追加したい場合があります。さらに、アクセス制御 [ 7 ] や情報フロー制御 [ 8 ] などのセキュリティに関する懸念事項もあります。各クラスは主要な機能が大きく異なりますが、二次的な機能を実行するために必要なコードは多くの場合同じです。アドバイス これは、既存のモデルに適用したい追加コードです。この例では、スレッドがメソッドに出入りするたびに適用したいログ記録コードです。ポイントカット これは、アプリケーション内で横断的関心を適用する必要がある実行ポイントを指します。この例では、スレッドがメソッドに入ったときにポイントカットに到達し、スレッドがメソッドから出たときに別のポイントカットに到達します。側面 ポイントカットとアドバイスの組み合わせをアスペクトと呼びます。上記の例では、ポイントカットを定義し、適切なアドバイスを与えることで、アプリケーションにログ記録機能を追加しています。
他のプログラミングパラダイムとの比較 アスペクトはオブジェクト指向プログラミング とリフレクティブプログラミング から生まれました。AOP言語はメタオブジェクトプロトコル と似た機能を持ちますが、より制限されています。アスペクトは、サブジェクト 、ミックスイン 、デリゲーション などのプログラミング概念と密接に関連しています。アスペクト指向プログラミングパラダイムを使用する他の方法としては、コンポジションフィルタ とハイパースライスアプローチがあります。少なくとも1970年代以降、開発者はAOPの実装方法の一部に似たインターセプションとディスパッチパッチングの形式を使用してきましたが、これらは横断的な仕様が1か所で提供する意味論を持っていませんでした。
設計者は、 C# の部分型など、コードの分離を実現するための代替手段を検討してきたが、そのようなアプローチには、1 つの宣言文でコードの複数の結合点に到達できるような量化メカニズムが欠けている。
一見無関係に思えるかもしれませんが、テストにおいてモックやスタブを使用するには、アラウンドアドバイスなどのAOP(アスペクト指向プログラミング)の手法を用いる必要があります。ここでは、テストの目的上、連携するオブジェクトは横断的な関心事となります。そのため、様々なモックオブジェクトフレームワークがこれらの機能を提供しています。例えば、あるプロセスがサービスを呼び出して残高を取得するとします。プロセスのテストにおいては、残高がどこから来るかは重要ではなく、プロセスが要件に従って残高を使用することだけが重要です。
養子縁組の問題 プログラマーはエラーを防ぐためにコードを読み、理解できる必要があります。[ 9 ] 適切な教育を受けていても、プログラムの静的構造と動的フローの両方を視覚化するための適切なサポートがなければ、横断的関心事を理解するのは難しい場合があります。[ 10 ] 2002 年以降、AspectJ は横断的関心事の視覚化をサポートする IDE プラグインの提供を開始しました。これらの機能、およびアスペクト コード アシストとリファクタリングは 、現在では一般的です。
AOPの強力な機能を考えると、横断的関心の表現において論理的な誤りを犯すと、プログラム全体に影響を及ぼす可能性があります。逆に、別のプログラマーが、メソッド名の変更や移動などによって、アスペクト作成者が想定していなかった方法でプログラムの結合点を変更し、予期せぬ結果を 招くこともあります。横断的関心をモジュール化する利点の1つは、1人のプログラマーがシステム全体に容易に影響を与えられることです。結果として、このような問題は、特定の障害に対する責任をめぐる2人以上の開発者間の対立として現れます。AOPは、アスペクトのみを変更すれば済むため、これらの問題の解決を迅速化できます。AOPを使用しない場合、同様の問題はより広範囲に及ぶ可能性があります。
批判 AOP の効果に対する最も基本的な批判は、制御フローが不明瞭になることであり、悪名高いGOTO ステートメントよりも悪いだけでなく、冗談のようなCOME FROM ステートメントと非常によく似ているというものです。[ 10 ] AOP の多くの定義の基本である適用の無知性 (問題のコードにはアドバイスが適用されるという兆候がなく、代わりにポイントカットで指定されます) は、明示的なメソッド呼び出しとは対照的に、アドバイスが見えないことを意味します。[ 10 ] [ 11 ] 例えば、COME FROM プログラムを比較してください。[ 10 ]
5 入力 X 10 出力 '結果は:' 15 出力 X 20 10 から 来る 25 X = X * X 30 戻り値 同様の意味を持つAOPフラグメントと共に:
main () { input x print ( result ( x )) } input result ( int x ) { return x } around ( int x ): call ( result ( int )) && args ( x ) { int temp = proceed ( x ) return temp * temp } 実際、ポイントカットは実行時の条件に依存する可能性があり、静的に決定論的ではない場合があります。静的解析と、どの助言が一致する可能性があるかを示すIDEのサポートによって、この問題は軽減できますが、完全に解決することはできません。
一般的な批判としては、AOP は「モジュール性とコード構造の両方を改善する」と謳っているが、実際にはこれらの目標を損ない、「プログラムの独立した開発と理解可能性」を阻害するというものがある。[ 12 ] 具体的には、ポイントカットによる定量化はモジュール性を破壊する。「一般的に、アスペクト指向プログラムの動的実行について推論するには、プログラム全体の知識が必要となる。」[ 13 ] さらに、その目標(横断的関心のモジュール化)はよく理解されているものの、実際の定義は不明確であり、他の確立された手法と明確に区別されていない。[ 12 ] 横断的関心は互いに交差する可能性があり、順序付けなどの解決メカニズムが必要となる。[ 12 ] 実際、アスペクトはそれ自身に適用できるため、嘘つきのパラドックス などの問題が生じる。[ 14 ]
技術的な批判としては、ポイントカットの定量化(アドバイスが実行される場所を定義すること)が「プログラムの変更に極めて敏感」であり、これは脆弱なポイントカット問題 として知られているという点が挙げられる。[ 12 ] ポイントカットの問題は解決不可能とみなされている。ポイントカットの定量化を明示的な注釈に置き換えると、属性指向プログラミング が得られるが、これは単に明示的なサブルーチン呼び出しであり、AOPが解決するように設計された散逸という同じ問題を抱えている。[ 12 ]
注釈と参考文献 ↑ Kiczales, G. ; Lamping, J.; Mendhekar, A.; Maeda, C.; Lopes, C.; Loingtier, JM; Irwin, J. (1997).アスペクト指向プログラミング (PDF) . ECOOP'97.第11回欧州オブジェクト指向プログラミング会議議事録 . Lecture Notes in Computer Science (LNCS). Vol. 1241. pp. 220– 242. CiteSeerX 10.1.1.115.8660 . doi : 10.1007/BFb0053381 . ISBN 3-540-63089-9 2016年1月12日にオリジナルからアーカイブされた(PDF) 。↑ 「適応型オブジェクト指向プログラミング:伝播パターンを用いたデメテルアプローチ」カール・リープヘル 1996 ISBN 0-534-94602-X 本質的に同じことを、より洗練された形で提示している(リーバーヘルは後にこれに気づき、自身のアプローチを再構築した)。 ↑ ドン・ボックス、クリス・セルズ(2002年11月4日)。Essential.NET : 共通言語ランタイム 。Addison-Wesley Professional。p . 206。ISBN 978-0-201-73411-9 2011年10月4日 に取得 。↑ Roman, Ed; Sriganesh, Rima Patel; Brose, Gerald (2005年1月1日). Mastering Enterprise JavaBeans . John Wiley and Sons. p. 285. ISBN 978-0-7645-8492-3 2011年10月4日 に取得 。↑ "gnu.org" . GNUプロジェクト。 2017年12月24日のオリジナルから アーカイブ済み。 2018年 5月5日 取得 。 ↑ 「アーカイブされたコピー」 (PDF) 。 2005年10月8日に オリジナル (PDF)からアーカイブされました 。 2005年 6月19日 に取得。 {{cite web}}: CS1 maint: タイトルとしてアーカイブされたコピー (リンク)↑ B. De Win、B. Vanhaute、B. De Decker。「アスペクト指向プログラミングによるセキュリティ」。ネットワークおよび分散システムセキュリティの進歩 (2002年)。 ↑ T. Pasquier、J. Bacon、B. Shand。「FlowR: Rubyにおける情報フロー制御のためのアスペクト指向プログラミング」。ACM第13回国際モジュラリティ会議(アスペクト指向ソフトウェア開発)論文集 (2014年)。 ↑ エドガー・ダイクストラ著 、『構造化プログラミングに関するノート』 (2006年10月12日、 Wayback Machine に アーカイブ) 、1-2ページ1 2 3 4 Constantinides, Constantinos; Skotiniotis, Therapon; Störzer, Maximilian (2004 年 9 月). AOP は有害であるとみなされる (PDF) . European Interactive Workshop on Aspects in Software (EIWAS). Berlin, Germany. 2016 年 3 月 23 日のオリジナルから アーカイブ (PDF) 。2018 年 5 月 5 日 取得 。 ↑ C2:ComeFrom 1 2 3 4 5 Steimann, F. ( 2006). "アスペクト指向プログラミングの逆説的な成功". ACM SIGPLAN Notices . 41 (10): 481–497 . CiteSeerX 10.1.1.457.2210 . doi : 10.1145/1167515.1167514 . (スライドはWayback Machine に2016年3月4日に アーカイブ済み、スライド2はWayback Machine に2015年9月23日に アーカイブ済み、要約はWayback Machine に2015年9月24日に アーカイブ済み)、フリードリヒ・シュタイマン、ゲイリー・T・リーベンズ、OOPSLA 2006↑ 「アスペクト指向プログラムのためのよりモジュール化された推論」 。 2015年8月12日にオリジナルから アーカイブ済み 。 2015年 8月11日に 取得。 ↑ 「AOPと嘘つきのアンチノミー」 (PDF) 。fernuni -hagen.de 。 2017年8月9日のオリジナルから アーカイブ (PDF) 。 2018年 5月5日 取得 。 ↑ 多数: Afterthought ( 2016-03-15 に Wayback Machineに アーカイブ) 、 LOOM.NET ( 2008-08-27 に Wayback Machineに アーカイブ)、 Enterprise Library 3.0 Policy Injection Application Block ( 2007-01-19 に Wayback Machineに アーカイブ) 、 AspectDNG ( 2004-09-29 に Wayback Machineに アーカイブ) 、 DynamicProxy (2015-12-05 に Wayback Machineに アーカイブ) 、 Compose* (2005-08-21 に Wikiwix に アーカイブ) 、 PostSharp (2016-05-03 にWayback Machine に アーカイブ) 、 Seasar.NET (2006-07-25 に Wayback Machineに アーカイブ) 、 DotSpect (.SPECT) (2006-03-31 にWayback Machine に アーカイブ) 、 Spring.NET (アーカイブ) 2006年4月2日、 Wayback Machine (その機能の一部として)に WiccaとPhx.Morphがアーカイブされました。 2006年12月7日 、 Wayback Machineに SetPointがアーカイブされました。2008年10月7日、 Wayback Machine に アーカイブされました。 ↑ "as3-commons-bytecodeへようこそ" . as3commons.org . 2014年10月3日のオリジナルから アーカイブ済み 。 2018年 5月5日 取得。 ↑ 「Ada2012の 根拠」 (PDF) 。adacore.com 。 2016年4月18日のオリジナルから アーカイブ (PDF) 。 2018年 5月5日 取得 。 ↑ 「関数フック」 . autohotkey.com . 2018年 5月5日 取得 。 {{cite web}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)↑ いくつか: AspectC++ 、 FeatureC++、 AspectC (2006年8月21日にWayback Machine に アーカイブ)、 AspeCt指向C ( 2008年11月20日にWayback Machine に アーカイブ) 、 Aspicere [ リンク削除 ] ↑ 「Cobble」 . vub.ac.be. 2018年 5月5日 取得 。 ↑ "AspectCocoa" . neu.edu . 2007年10月26日の オリジナルからアーカイブ済み 。 2018年 5月5日 取得。 ↑ 「ColdSpring Framework: ようこそ」 。2005年11月5日。2005年11月5日のオリジナルからアーカイブ。 2018年 5月5日 取得 。 {{cite web}}: CS1 maint: bot: 元の URL の状態が不明です (リンク)↑ 「Closer Project: AspectL」 。 2011年2月23日にオリジナルから アーカイブ済み 。 2015年 8月11日 に取得。 ↑ "infra – Frameworks Integrados para Delphi – Google Project Hosting" 。 2015年9月9日にオリジナルから アーカイブ済み 。 2015年 8月11日 に取得。 ↑ "meaop – MeSDK: MeObjects、MeRTTI、MeAOP – Delphi AOP(アスペクト指向プログラミング)、MeRemote、MeService... – Googleプロジェクトホスティング" 。 2015年9月10日にオリジナルから アーカイブ済み。 2015年 8月11日 に取得 。 ↑ 「Google プロジェクト ホスティング」 。2014 年 12 月 25 日時点のオリジナルから アーカイブ済み。2015 年 8 月 11 日 取得 。 ↑ "RemObjects Cirrus" . codegear.com . 2012年1月23日の オリジナルからアーカイブ済み 。 2018年 5月5日 取得。 ↑ 「Emacs アドバイス関数」 。GNU プロジェクト。2011 年 10 月 24 日時点のオリジナルから アーカイブ済み。2018 年 5 月 5 日 取得 。 ↑ モナドは 、プログラムのコードを変更せずにプログラムの型を変更することで、プログラムのセマンティクスを変更することを可能にします。De Meuter, Wolfgang (1997). "Monads As a theoretical basis for AOP". International Workshop on Aspect-Oriented Programming at ECOOP : 25. CiteSeerX 10.1.1.25.8262 。 Tabareau, Nicolas; Figueroa, Ismael; Tanter, Éric (2013年3月) 「アスペクトの型付きモナド埋め込み」 .第12回アスペクト指向ソフトウェア開発国際会議議事録 (PDF) . Aosd '13. pp. 171–184 . doi : 10.1145 /2451436.2451457 . ISBN 9781450317665 . S2CID 27256161 . 型クラスは 、型に機能を追加することを可能にする。Sulzmann , Martin; Wang, Meng (2007年3月) 「型クラスを用いたアスペクト指向プログラミング」 第 6回アスペクト指向言語の基礎に関するワークショップ議事録 (PDF) pp. 65–74 . doi : 10.1145/1233833.1233842 . ISBN 978-1595936615 . S2CID 3253858 . 。↑ その他多数: CaesarJ ( 2008-12-19 にWayback Machine に アーカイブ) 、 Compose* ( 2005-08-21 に Wikiwix に アーカイブ) 、 Dynaop (2007-07-24 にWayback Machine に アーカイブ)、 JAC ( 2004-06-19 にWayback Machine に アーカイブ) 、 Google Guice (その機能の一部として)、 Javassist ( 2004-09-01 に Wayback Machineに アーカイブ) 、 JAsCo (および AWED) ( 2005-04-11 に Wayback Machineに アーカイブ) 、 JAML ( 2005-04-15に Wayback Machineに アーカイブ)、 JBoss AOP ( 2006-10-17 に Wayback Machineに アーカイブ) 、 LogicAJ (2006-05-04 に Wayback Machineに アーカイブ) 、 Object Teams (アーカイブ) 2005年8月31日Wayback Machine に アーカイブ済み、 PROSE 2007年1月24日Wayback Machine に アーカイブ済み、 AspectJ 用 AspectBench コンパイラ (abc) 2014年12月16日 Wayback Machine に アーカイブ 済み、 Spring フレームワーク (その機能の一部として)、 Seasar 、 JMangler プロジェクト2005年10月28日 Wayback Machine に アーカイブ済み、InjectJ 2005年4月5日 Wayback Machine にアーカイブ済み、GluonJ 2007年2月6日 Wayback Machineにアーカイブ済み 、 Steamloom 2007年8 月 18日Wayback Machine に アーカイブ済み ↑ Many: Advisable (2008-07-04 に Wayback Machineに アーカイブ) 、 Ajaxpect ( 2016-07-09 に Wayback Machineに アーカイブ)、 jQuery AOP Plugin ( 2008-01-13 に Wayback Machineに アーカイブ)、 Aspectes (2006-05-08 に Wikiwix に アーカイブ) 、 AspectJS ( 2008-12-16 に Wayback Machine に アーカイブ) 、 Cerny.js ( 2007-06-27 にWayback Machineに アーカイブ)、 Dojo Toolkit ( 2006-02-21 にWayback Machine に アーカイブ) 、 Humax Web Framework (2008-12-09 に Wayback Machineに アーカイブ)、 Joose ( 2015-03-18 にWayback Machine に アーカイブ)、 Prototype – Prototype Function#wrap (2009-05-05 に アーカイブ) Wayback Machine 、 YUI 3 (Y.Do) 2011年1月25日にWayback Machine に アーカイブされました ↑ カテゴリの組み込みサポート(アスペクト コードのカプセル化を可能にする)とイベント駆動型プログラミング(イベントハンドラの 前後 の)を使用します。 ↑ "AspectLua" 。 2015年7月17日にオリジナルから アーカイブされました 。 2015年 8月11日 に取得。 ↑ 「MAKAO、ビルドシステムのリバースエンジニアリング」 。 2015年 8月11日 取得 。 {{cite web}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)↑ 「McLab」 。 2015年9月24日にオリジナルから アーカイブ済み 。 2015年 8月11日 に取得。 ↑ 「AspectML – アスペクト指向関数型プログラミング言語の研究」 。 2010年12月5日の オリジナル からアーカイブ。 2015年 8月11日 取得 。 ↑ "マスター・rsdn/nemerle の nemerle/README.md" 。 GitHub 。 2018 年 3 月 22 日 に取得 。 ↑ Adam Kennedy. "Aspect – Perl のためのアスペクト指向プログラミング (AOP) – metacpan.org" . 2013 年 8 月 31 日時点のオリジナルから アーカイブ済み。2015 年 8 月 11 日 取得 。 ↑ いくつか: PHP-AOP (AOP.io) Wikiwix に 2014-08-18 に アーカイブ済み、 Go! AOP フレームワークWayback Machine に 2013-03-01 に アーカイブ済み、 PHPaspect Wayback Machine に 2016-08-22 に アーカイブ済み、 Seasar.PHP Wayback Machine に 2005-12-26 に アーカイブ済み、 PHP-AOP [ リンク削除済み ] 、 Flow Wayback Machine に 2018-01-04 に アーカイブ済み、 AOP PECL Extension Wayback Machine に 2017-04-11 に アーカイブ済み ↑ 「Prolog によるアスペクト指向プログラミング」 . bigzaphod.org . 2005 年 12 月 14 日。2012 年 3 月 3 日の オリジナルからアーカイブ済み。2018 年 5 月 5 日 取得 。 ↑ いくつか: PEAK ( 2005年4月9日にWayback Machine に アーカイブ) 、 Aspyct AOP、軽量Python AOP ( 2004年10月9日に Wayback Machineに アーカイブ) 、 Logilabのアスペクトモジュール(2005年3月9日に Wayback Machine に アーカイブ) 、 Pythius ( 2005年4月8日にWayback Machineに アーカイブ)、 Spring PythonのAOPモジュール ( 2016年3月4日にWayback Machineに アーカイブ)、 PytilitiesのAOPモジュール(2011年8月25日にWayback Machine に アーカイブ)、 aspectlib ( 2014年11月5日にWayback Machine に アーカイブ) ↑ "PLaneT パッケージリポジトリ : PLaneT > dutchyn > aspectscheme.plt" 。2015 年 9 月 5 日のオリジナルから アーカイブ済み 。2015 年 8 月 11 日 に取得。 ↑ 「AspectR – Ruby によるシンプルなアスペクト指向プログラミング」 。2015 年 8 月 12 日時点のオリジナルから アーカイブ済み。2015 年 8 月 11 日 取得 。 ↑ ディーン・ワンプラー。 「ホーム」 。 2007年10月26日の オリジナル からアーカイブ済み。 2015年 8月11日 取得 。 ↑ "gcao/aspector" . GitHub . 2015年1月4日のオリジナルから アーカイブ済み。 2015年 8月11日 取得 。 ↑ "AspectS" . tu-ilmenau.de . 2006年1月6日に オリジナルからアーカイブ済み 。 2018年 5月5日 に取得。 ↑ 「MetaclassTalk: Smalltalkにおけるリフレクションとメタプログラミング」 。 2015年7月29日の オリジナルからアーカイブ済み。 2015年 8月11日 取得 。 ↑ "WEAVR" . iit.edu . 2008年12月12日のオリジナルから アーカイブ済み 。 2018年 5月5日 取得。 ↑ "aspectxml – アスペクト指向XMLウィービングエンジン(AXLE) – Googleプロジェクトホスティング" 。 2015年9月12日のオリジナルから アーカイブ済み。 2015年 8月11日 取得 。
さらに読む Kiczales, G. ; Lamping, J.; Mendhekar, A.; Maeda, C.; Lopes, C.; Loingtier, JM; Irwin, J. (1997).アスペクト指向プログラミング (PDF) . ECOOP'97.第11回欧州オブジェクト指向プログラミング会議議事録 . Lecture Notes in Computer Science (LNCS). Vol. 1241. pp. 220–242 . CiteSeerX 10.1.1.115.8660 . doi : 10.1007/BFb0053381 . ISBN 3-540-63089-9 。 この論文は、AOPに関する権威ある参考文献として一般的に認められている。ロバート・E・フィルマン、ツィラ・エルラッド、シボーン・クラーク 、メフメト・アクシット(2004)。アスペクト指向ソフトウェア開発 。アディソン・ウェスリー。ISBN 978-0-321-21976-3 。 ルノー・ポーラック、リオネル・サンチュリエ、ジャン=フィリップ・リタイレ(2005)。J2EE開発のため のAOPの基礎 。Apress。ISBN 978-1-59059-507-7 。 ラダッド、ラムニバス (2003)。『AspectJ in Action: Practical Aspect-Oriented Programming』 。マニング 。ISBN 978-1-930110-93-9 。ジェイコブソン、イヴァル ;パンウェイ・ン (2005)。アスペクト指向ソフトウェア開発とユースケース 。アディソン・ウェスリー。ISBN 978-0-321-26888-4 。アスペクト指向ソフトウェア開発とPHP、ドミトリー・シェイコ、2006年 シボーン・クラーク &エリサ・バニアサド(2005)。アスペクト指向分析と設計:テーマアプローチ 。アディソン・ウェスリー。ISBN 978-0-321-24674-5 。Raghu Yedduladoddi (2009).アスペクト指向ソフトウェア開発:UML設計モデルの構成へのアプローチ . VDM. ISBN 978-3-639-12084-4 。 「グラフベースのカスタマイズを用いた適応型オブジェクト指向プログラミング」 – Lieberherr、Silva-Lepe他 – 1994年 Zambrano Polo y La Borda, Arturo Federico (2013年6月5日). 「産業環境における側面間の相互作用への対応:経験、問題、および解決策」 : 159. doi : 10.35537/10915/35861 . 2014年 5月30日 取得 。 Wijesuriya, Viraj Brian (2016-08-30)アスペクト指向開発、講義ノート、コロンボ大学コンピューティング学部、スリランカ Groves, Matthew D. (2013). AOP in .NET . Manning. ISBN 9781617291142 。
外部リンク エリック・ボデン氏 による.NETフレームワークにおけるAOPツールのリストアスペクト指向ソフトウェア開発、AOPに関する年次会議 AspectJプログラミングガイド AspectJ 用の AspectBench コンパイラは、別の Java 実装です。 IBM developerWorksのAOPに関する一連の記事 ラダッド、ラムニバス(2002年1月18日)。「私の AOP が欲しいです!、パート 1」。JavaWorld 。2020 年7 月 20 日 に取得 。 アスペクト指向プログラミングとAspectJの基礎に関する詳細な一連の記事アスペクト指向プログラミングとは?、RemObjects Tacoによる入門編 制約仕様アスペクトウィーバー アスペクト指向プログラミングとオブジェクト指向プログラミング:どちらの手法をいつ使うべきか? (2021年4月15日、 Wayback Machine に アーカイブ済み) グレゴール・キザレス教授(コンピュータサイエンス)によるAOPの説明(動画、57分)。 COBOLにおけるアスペクト指向プログラミング( 2008年12月17日にWayback Machine に アーカイブ済み) Springフレームワークを用いたJavaにおけるアスペクト指向プログラミング .NETにおけるAOPメソッドに関するWiki ビジネスプロセスモデリングの初期段階(BPMNのためのアスペクト指向言語) Spring AOPとAspectJの紹介 ビルケント大学におけるAOSD大学院コース AOP入門 – ソフトウェアエンジニアリングラジオポッドキャスト第106回 Szilveszter Molnar による AOP の Objective-C 実装 マヌエル・ゲベレ著『iOSおよびOS Xのためのアスペクト指向プログラミング』 DevExpress MVVMフレームワーク。POCOビューモデル入門