質問
私はオブジェクト指向プログラミングを理解しており、オブジェクト指向プログラムを長い間書いてきました。人々はアスペクト指向プログラミングについて話しているようですが、私はそれが何であるか、またはそれをどのように使用するかを本当に学んだことはありません。基本的なパラダイムは何ですか?
この質問は関連していますが、まったく質問していません:
解決
AOPは、さまざまな方法で繰り返されるあらゆる種類のコードであり、通常はロギングや検証。したがって、AOPを使用すると、メインコードからそのようなものを除外し、次のように垂直に定義できます。
function mainProgram()
{
var x = foo();
doSomethingWith(x);
return x;
}
aspect logging
{
before (mainProgram is called):
{
log.Write("entering mainProgram");
}
after (mainProgram is called):
{
log.Write( "exiting mainProgram with return value of "
+ mainProgram.returnValue);
}
}
aspect verification
{
before (doSomethingWith is called):
{
if (doSomethingWith.arguments[0] == null)
{
throw NullArgumentException();
}
if (!doSomethingWith.caller.isAuthenticated)
{
throw Securityexception();
}
}
}
次に、 aspect-weaver を使用して、コードを次のようにコンパイルします。
function mainProgram()
{
log.Write("entering mainProgram");
var x = foo();
if (x == null) throw NullArgumentException();
if (!mainProgramIsAuthenticated()) throw Securityexception();
doSomethingWith(x);
log.Write("exiting mainProgram with return value of "+ x);
return x;
}
他のヒント
残念なことに、AOPを通常の中規模から大規模の組織で本当に役立つものにすることは驚くほど難しいようです。 (編集者のサポート、コントロールの感覚、コード腐敗につながるそれほど重要ではないことから始めるという事実、人々が家族に帰るなど)
複合指向プログラミングに期待しています。これはより現実的なものです。多くの人気のあるアイデアにつながり、本当にクールなものを提供します。
今後の実装をご覧ください: qi4j.org/
PS。実際、AOPの美しさの1つはアキレス腱でもあると思います:その邪魔にならないため、できる限り人々に無視させるため、ほとんどの組織で二次的な懸念として扱われます。
完全性のために複製からコピー(アインシュタイン):
典型的な例は、セキュリティとロギングです。アプリケーション内でコードを記述してxの発生を記録したり、オブジェクトzのセキュリティアクセス制御をチェックしたりする代わりに、「帯域外」という言語の仕掛けがあります。体系的にセキュリティを注入したり、コードが提供していなくても自然にそれらを持たないルーチンにログインしたりすることができる通常のコード。
より具体的な例は、ファイルへのアクセス制御を提供するオペレーティングシステムです。基盤となるシステムがソフトウェアプログラムで機能するため、ソフトウェアプログラムはアクセス制限を確認する必要はありません。
私の経験でAOPが必要だと思うなら、実際には、よく考えられた構造/システム設計に焦点を合わせて、システム内の適切なメタデータ管理により多くの時間と労力を費やす必要があります。
Spring in Actionからコピー
AOPは、多くの場合、 ソフトウェアシステムの懸念。システムはいくつかで構成されています コンポーネント。それぞれが特定の機能を担当します。 しかし、多くの場合、これらのコンポーネントには追加の責任も伴います コア機能を超えています。ロギングなどのシステムサービス、 トランザクション管理とセキュリティは、多くの場合、 コアの責任が何か他のものであるコンポーネント。これらのシステム サービスは一般に横断的関心事と呼ばれます システム内の複数のコンポーネントにまたがる傾向があります。
完全性のために複製からコピー(ブザー):
.NETのクラス属性とメソッド属性は、アスペクト指向プログラミングの一形態です。クラス/メソッドを属性で装飾します。舞台裏では、属性の特定の機能を実行するコードをクラス/メソッドに追加します。たとえば、クラスをシリアル化可能とマークすると、保存または別のシステムへの送信のためにクラスを自動的にシリアル化できます。他の属性は特定のプロパティを非シリアル化可能としてマークし、これらはシリアル化されたオブジェクトから自動的に省略されます。シリアル化は、システム内の他のコードによって実装され、「構成」アプリケーションの適用によってクラスに適用される側面です。属性(装飾)。
AOPの例がありますが、例としてスプリングAOPを使用しました。この例は非常に理解しやすいです。
Spring AOP(アスペクト指向プログラミング)フレームワークは、アスペクトの横断的関心事をモジュール化するために使用されます。簡単に言えば、一部のプロセスをインターセプトするインターセプターにすぎません。たとえば、メソッドの実行時に、Spring AOPは実行中のメソッドをハイジャックし、メソッド実行の前後に追加機能を追加できます。
参照: http://www.mkyong.com/spring/spring -aop-examples-advice /
AOPは、ロギング、キャッシングなど、アプリのビジネスロジックに関連しないアクションを実行するために使用できます。これらのアクションは、アプリの別の部分に配置し、アプリケーション全体で再利用できます。通常、これを達成するには2つの方法があります。メソッドの前後にプリプロセッサによって自動的にコードを挿入するか、メソッド呼び出しをインターセプトし、メソッド呼び出しの前後に実行できるプロキシクラスをアタッチします。
.Netの例を次に示します。プロキシクラスを使用してメソッド呼び出しをインターセプトします saifメソッド呼び出しの前後にコードを実行します。
AutoFacおよびDynamicProxyを使用した.NET CoreおよびC#のアスペクト指向プログラミング(AOP)
AOPは、複数の境界にまたがる機能のためにアプリケーションをより適切にモジュール化する方法です。 AOPは、これらの機能をカプセル化し、アプリケーションの主要コンポーネントからこれらの横断的な関心事(ロギング、エラー処理など)を移動することにより、単一の責任に従う別の方法です。 AOPを適切に使用すると、時間の経過とともにアプリケーションの保守性と拡張性のレベルが高くなります。