web-dev-qa-db-ja.com

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

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

この質問は関連していますが、まったく質問していません。

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

212
Sophie

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;
} 
183
Mark Cidade

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

私は複合指向プログラミングに期待しています。これはより現実的なものです。それは多くの人気のあるアイデアにつながり、本当にクールなものを提供します。

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

PS。実際、AOPの美しさの1つはアキレス腱でもあると思います。それは邪魔にならないため、できる限り人々に無視させるので、ほとんどの組織で二次的な懸念として扱われます。

13
Hugo

完全性のために複製からコピーされた(Einstein):

典型的な例は、セキュリティとロギングです。アプリケーション内でコードを記述してxの発生を記録したり、セキュリティアクセス制御のためにオブジェクトzをチェックしたりする代わりに、通常のコードの「帯域外」の言語の仕掛けがあります。あなたのコードがそれを提供しなくても、そのような方法-その世話をします。

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

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

8
paxdiablo

Spring in Actionからコピー

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

6
user2493028

完全を期して複製からコピー(ブザー):

.NETのクラス属性とメソッド属性は、アスペクト指向プログラミングの一形態です。クラス/メソッドを属性で装飾します。舞台裏では、属性の特定の機能を実行するコードをクラス/メソッドに追加します。たとえば、クラスをシリアル化可能にマークすると、保存または別のシステムへの送信のためにクラスを自動的にシリアル化できます。他の属性は、特定のプロパティを非シリアル化可能としてマークし、これらはシリアル化されたオブジェクトから自動的に省略されます。シリアル化は、システム内の他のコードによって実装され、「構成」属性(装飾)のアプリケーションによってクラスに適用される側面です。

5
paxdiablo

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

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

参照: http://www.mkyong.com/spring/spring-aop-examples-advice/

4
R.F

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

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

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

4
Carlos Blanco

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

2
SaaS Developer