私はオブジェクト指向プログラミングを理解しており、長い間OOプログラムを作成しています。人々はアスペクト指向プログラミングについて話しているようですが、私はそれが何であるか、それをどのように使用するかを実際に学んだことはありません。基本的なパラダイムは何ですか?
この質問は関連していますが、まったく尋ねるものではありません。
私はオブジェクト指向プログラミングを理解しており、長い間OOプログラムを作成しています。人々はアスペクト指向プログラミングについて話しているようですが、私はそれが何であるか、それをどのように使用するかを実際に学んだことはありません。基本的なパラダイムは何ですか?
この質問は関連していますが、まったく尋ねるものではありません。
回答:
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();
}
}
}
次に、アスペクトウィーバーを使用してコードを次のようにコンパイルします。
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を本当に役立つようにすることは驚くほど難しいようです。(編集者のサポート、コントロールの感覚、コードの腐敗につながるそれほど重要ではないことから始めるという事実、家族の家に帰るなど)
私は、より現実的な複合指向プログラミングに期待を寄せています。それは多くの人気のアイデアに接続し、あなたに本当にクールな何かを与えます。
PS。実際、AOPの美しさの1つはアキレス腱でもあると思います。邪魔にならないので、可能であれば無視してもらえるため、ほとんどの組織では二次的な懸念事項として扱われます。
完全性のために複製からコピーしました(アインシュタイン):
典型的な例は、セキュリティとロギングです。アプリケーション内でコードを記述してxの発生を記録したり、オブジェクトzをチェックしてセキュリティアクセス制御を行ったりする代わりに、体系的にセキュリティを注入したり、ネイティブではないルーチンにログインしたりできる、通常のコードの「帯域外」の言語の仕掛けがあります。あなたのコードがそれを供給しないとしても、そのように処理されます。
より具体的な例は、ファイルへのアクセス制御を提供するオペレーティングシステムです。基盤となるシステムがソフトウェアプログラムで機能するため、ソフトウェアプログラムはアクセス制限をチェックする必要がありません。
私の経験でAOPが必要だと思う場合、実際には、十分に考えられた構造/システム設計に焦点を当てた、システム内の適切なメタデータ管理にさらに多くの時間と労力を費やす必要があります。
Spring in Actionからコピー
AOPは、ソフトウェアシステムでの懸念の分離を促進する手法として定義されることがよくあります。システムはいくつかのコンポーネントで構成され、それぞれが特定の機能を担当します。しかし、多くの場合、これらのコンポーネントには、コア機能以外にも追加の責任があります。ロギング、トランザクション管理、セキュリティなどのシステムサービスは、多くの場合、コアとなる役割が別のコンポーネントになっています。これらのシステムサービスは、システム内の複数のコンポーネントを横断する傾向があるため、一般に横断的関心事と呼ばれます。
完全を期すために複製からコピー(ブザー):
.NETのクラスとメソッドの属性は、アスペクト指向プログラミングの一種です。クラス/メソッドを属性で装飾します。これにより、属性の特定の機能を実行するコードがクラス/メソッドに追加されます。たとえば、クラスを直列化可能としてマークすると、ストレージまたは別のシステムへの送信のために自動的に直列化できます。その他の属性は、特定のプロパティをシリアル化不可としてマークする場合があり、これらはシリアル化されたオブジェクトから自動的に省略されます。シリアライゼーションはアスペクトであり、システムの他のコードによって実装され、「構成」属性(装飾)を適用することによってクラスに適用されます。
AOPを使用して、ロギング、キャッシングなど、アプリのビジネスロジックに関連しないアクションを実行できます。これらのアクションは、アプリの別の部分に配置して、アプリケーション全体で再利用できます。通常、これを行うには2つの方法があります。メソッドの前後にプリプロセッサによって自動的にコードを挿入するか、メソッド呼び出しをインターセプトして、メソッド呼び出しの前後に実行できるプロキシクラスをアタッチします。
これが.Netの例です。プロキシクラスを使用してメソッド呼び出しをインターセプトし、saifメソッド呼び出しの前後にコードを実行します。
AutoFacおよびDynamicProxyを使用した.NET CoreおよびC#のアスペクト指向プログラミング(AOP)
AOPの例があり、例として春のAOPを使用しました。例は非常に理解しやすいです。
Spring AOP(アスペクト指向プログラミング)フレームワークは、アスペクトの分野横断的な懸念をモジュール化するために使用されます。簡単に言えば、それはいくつかのプロセスをインターセプトする単なるインターセプターです。たとえば、メソッドが実行されると、Spring AOPは実行中のメソッドをハイジャックし、メソッド実行の前後に機能を追加できます。
リファレンス:http : //www.mkyong.com/spring/spring-aop-examples-advice/