アスペクト指向プログラミングとは何ですか?


231

私はオブジェクト指向プログラミングを理解しており、長い間OOプログラムを作成しています。人々はアスペクト指向プログラミングについて話しているようですが、私はそれが何であるか、それをどのように使用するかを実際に学んだことはありません。基本的なパラダイムは何ですか?

この質問は関連していますが、まったく尋ねるものではありません。

アスペクト指向プログラミングとオブジェクト指向プログラミング


5
IMAO、質問で提供されたリンクは、ここで受け入れられたものよりも明確で完全な答えを持っています。この質問を読む人は最初にそれを読むかもしれません。
デビッドチェン

回答:


198

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;
} 

14
それでは、このための言語サポートが必要ですか?あなたの例は何語ですか?
ソフィー

8
これは疑似コードですが、最もよく知られている例はAspectJです。これは、カットポイントと呼ばれる同様の手法を使用するJavaのAOP変更です。
Mark Cidade、

71
ブードゥー教。そして、OOPはやり過ぎだと思いました。
エイデンベル

17
マーク、これはメソッドの入り口と出口を飾るようなものですか?
FilipDupanović

3
@AidenBell遠くで目に見えないアクションがブードゥー教と見なすことができる場合、はい、それはブードゥー教です。Mooseメタプログラミングでは、before、after、around、inner、augmentなどのメソッド修飾子がまさにそれを行います。プログラムの実行フローを覆い隠します。これらを追跡することはほとんど不可能です。特に、システムのバージョンと呼ばれ、役割と呼ばれます。これらすべてで、驚異的な複雑さのシステムを構成できます。
tchrist '19 / 03/16

13

残念ながら、通常の中規模組織でAOPを本当に役立つようにすることは驚くほど難しいようです。(編集者のサポート、コントロールの感覚、コードの腐敗につながるそれほど重要ではないことから始めるという事実、家族の家に帰るなど)

私は、より現実的な複合指向プログラミングに期待を寄せています。それは多くの人気のアイデアに接続し、あなたに本当にクールな何かを与えます。

ここで最新の実装を見てください:qi4j.org/

PS。実際、AOPの美しさの1つはアキレス腱でもあると思います。邪魔にならないので、可能であれば無視してもらえるため、ほとんどの組織では二次的な懸念事項として扱われます。


8

完全性のために複製からコピーしました(アインシュタイン):

典型的な例は、セキュリティとロギングです。アプリケーション内でコードを記述してxの発生を記録したり、オブジェクトzをチェックしてセキュリティアクセス制御を行ったりする代わりに、体系的にセキュリティを注入したり、ネイティブではないルーチンにログインしたりできる、通常のコードの「帯域外」の言語の仕掛けがあります。あなたのコードがそれを供給しないとしても、そのように処理されます。

より具体的な例は、ファイルへのアクセス制御を提供するオペレーティングシステムです。基盤となるシステムがソフトウェアプログラムで機能するため、ソフトウェアプログラムはアクセス制限をチェックする必要がありません。

私の経験でAOPが必要だと思う場合、実際には、十分に考えられた構造/システム設計に焦点を当てた、システム内の適切なメタデータ管理にさらに多くの時間と労力を費やす必要があります。


7

Spring in Actionからコピー

AOPは、ソフトウェアシステムでの懸念の分離を促進する手法として定義されることがよくあります。システムはいくつかのコンポーネントで構成され、それぞれが特定の機能を担当します。しかし、多くの場合、これらのコンポーネントには、コア機能以外にも追加の責任があります。ロギング、トランザクション管理、セキュリティなどのシステムサービスは、多くの場合、コアとなる役割が別のコンポーネントになっています。これらのシステムサービスは、システム内の複数のコンポーネントを横断する傾向があるため、一般に横断的関心事と呼ばれます。


6

完全を期すために複製からコピー(ブザー):

.NETのクラスとメソッドの属性は、アスペクト指向プログラミングの一種です。クラス/メソッドを属性で装飾します。これにより、属性の特定の機能を実行するコードがクラス/メソッドに追加されます。たとえば、クラスを直列化可能としてマークすると、ストレージまたは別のシステムへの送信のために自動的に直列化できます。その他の属性は、特定のプロパティをシリアル化不可としてマークする場合があり、これらはシリアル化されたオブジェクトから自動的に省略されます。シリアライゼーションはアスペクトであり、システムの他のコードによって実装され、「構成」属性(装飾)を適用することによってクラスに適用されます。


5

AOPを使用して、ロギング、キャッシングなど、アプリのビジネスロジックに関連しないアクションを実行できます。これらのアクションは、アプリの別の部分に配置して、アプリケーション全体で再利用できます。通常、これを行うには2つの方法があります。メソッドの前後にプリプロセッサによって自動的にコードを挿入するか、メソッド呼び出しをインターセプトして、メソッド呼び出しの前後に実行できるプロキシクラスをアタッチします。

これが.Netの例です。プロキシクラスを使用してメソッド呼び出しをインターセプトし、saifメソッド呼び出しの前後にコードを実行します。

AutoFacおよびDynamicProxyを使用した.NET CoreおよびC#のアスペクト指向プログラミング(AOP)


4

AOPの例があり、例として春のAOPを使用しました。例は非常に理解しやすいです。

Spring AOP(アスペクト指向プログラミング)フレームワークは、アスペクトの分野横断的な懸念をモジュール化するために使用されます。簡単に言えば、それはいくつかのプロセスをインターセプトする単なるインターセプターです。たとえば、メソッドが実行されると、Spring AOPは実行中のメソッドをハイジャックし、メソッド実行の前後に機能を追加できます。

リファレンス:http : //www.mkyong.com/spring/spring-aop-examples-advice/


コンピューティングでは、アスペクト指向プログラミング(AOP)は、横断的な関心事の分離を可能にすることによってモジュール性を高めることを目的とするプログラミングパラダイムです。
RF

3

AOPは、複数の境界にまたがる機能のためにアプリケーションをより適切にモジュール化する方法です。AOPは、これらの機能をカプセル化し、これらの分野横断的な懸念事項(ロギング、エラー処理など)をアプリケーションのメインコンポーネントの外に移動することによって単一の責任に従う別の方法です。AOPを適切に使用すると、時間の経過とともにアプリケーションの保守性と拡張性のレベルが高くなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.