252

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

この質問は関連していますが、あまり質問していません:

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

4

7 に答える 7

213

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;
} 
于 2008-10-28T03:46:05.267 に答える
13

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

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

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

PS。実際、AOP の美点の 1 つはそのアキレス腱でもあると思います。非侵入型で、できれば無視できるため、ほとんどの組織では二次的な問題として扱われます。

于 2008-10-28T04:07:36.517 に答える
9

Spring in Action からコピー

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

于 2015-09-15T09:27:49.497 に答える
8

完全を期すために複製からコピー(アインシュタイン):

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

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

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

于 2008-11-26T04:28:23.910 に答える
6

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

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

于 2008-11-26T04:27:50.450 に答える
4

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

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

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

于 2016-04-24T15:23:42.027 に答える
4

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

于 2008-10-28T03:52:12.680 に答える