51

ロギングしていないアスペクト指向プログラミング (AOP) の例を誰か投稿できますか?

いくつかのリソースを見てきましたが、すべての例は些細なロギングです。それは何に役立ちますか?

4

14 に答える 14

35

このAspect Oriented Programming: Radical Research in Modularity, Youtube ビデオから直接借用した例の 1 つは、ディスプレイへのペイントでした。この例では、点や形状などで構成される描画プログラムがあり、これらのオブジェクトが変更された場合は、ディスプレイ自体を更新するように指示する必要があります。ある側面でそれを処理しないと、かなりのことを繰り返すことになります。

私が理解しているように、AOP は、ビジネス ロジックとは何の関係もないかもしれない分野横断的な懸念事項について自分自身を繰り返さないために作成されました。アスペクトを使用すると、これらの懸念をアスペクトにモジュール化できます。例の 1 つはログ記録でしたが、繰り返しになる可能性のあるさまざまなことがたくさんあります。それ以来進化しており、もはやアスペクト指向プログラミングではなく、アスペクト指向モデリングもあります。

アスペクト指向プログラミングの詳細については、次のソースを参照してください。

于 2008-11-28T12:12:55.537 に答える
11

安全

  • アクセス許可をチェックしてアクセスをブロックするコードを挿入する

asp.net webcontrols/webparts のわかりやすいエラー メッセージ

  • 例外をキャッチし、デバッグ コンパイル時にスタック トレースを書き込むコード、またはエラー コンパイル時にフレンドリー メッセージを書き込むコードを挿入します (ここにあるようなもの: asp.net / MOSS2007 の透明な汎用例外処理 (コード付き) ) 。

パフォーマンス

  • パフォーマンス カウンターを設定するコードを挿入して、アプリが遅い場所の概要を取得します
于 2008-11-28T11:50:31.557 に答える
6

元に戻す - 元に戻す操作をサポートするサードパーティのアセンブリを呼び出しています。呼び出し元は、元に戻すコンテキストを作成し、アセンブリ内のいくつかのメソッドを呼び出してから、元に戻すコンテキストを破棄する必要があります。コンテキストはネストできます。また、コンテキストが作成されたが、アプリの再起動が必要な望ましくない状態のままになっている場合。

通常、元に戻すには、次のように記述します

    void foo()
    {
        int id = lib.create_undo_context();
        try
        {
            lib.performsomeaction();
            lib.performsomeaction();
            lib.performsomeaction();

        }
        finally
        {
            lib.destroy_undo_context(id);
        }
    }

PostSharp を使用して、メソッドの開始時に元に戻すコンテキストを作成し、メソッドの終了時に (例外がスローされた場合でも) 破棄する [元に戻す] という属性を定義します。したがって、コードは次のようになります。

    [Undo]
    void foo()
    {
        lib.performsomeaction();
        lib.performsomeaction();
        lib.performsomeaction();
    }

ネストされた Undo コンテキストがある場合でも、すべての Undo コンテキストが確実にクリーンアップされるようにするため、これを実装するのは私が示しているよりも少し複雑ですが、アイデアは理解できます。

于 2008-12-20T13:44:11.687 に答える
6

検証:

[NotNull]
public string Property1 { get; set; }

[Length(Min = 10, Max = 20)]
public string Property2 { get; set; }

[Regex(Expression = @"[abc]{2}")]
public string Property3 { get; set; }
于 2008-11-28T11:51:25.017 に答える
5

依存性注入

厳密に言えば、依存性注入は分野横断的な問題にすぎません。多くの依存性注入フレームワークは、次のような属性ベースのプログラミング スタイルを使用します。

public class Car:IDisposable
{
    [Inject]
    public IGearBox Gearbox { get; set; }
   ...
}

[Inject] 属性は、外部フレームワークに依存しないアスペクトとして設計することもできます。

于 2012-07-17T09:39:32.577 に答える
5

もう 1 つの典型的な例 (ロギングなど) はキャッシュです。しかし、他の例はもっと興味深いものです。

于 2008-11-28T20:55:53.437 に答える
4

JavaおよびAspectJ(HannemannおよびKiczales)でのデザインパターンの実装:http ://www.cs.ubc.ca/labs/spl/papers/2002/oopsla02-patterns.pdf

このペーパーは、AspectJを使用してJavaでいくつかのGoFデザインパターンをより良い方法で実装する方法を示しています

于 2008-11-28T12:31:28.197 に答える
3

セキュリティ - 特定のメソッドを実行する前に、ユーザーが適切な権限を持っていることを確認します。

于 2008-11-28T11:44:13.533 に答える
3

Java では多重継承を行うことはできません。ただし、AOP を使用すると、「限定的な」多重継承を行うことができます。これをグーグルで検索して、いくつかの例を確認してください。

私もEyvidに同意します。Hannemann と Kiczales の論文は、デザイン パターンの基礎を学び、優れた AOP の例を得るのに最適です。

于 2008-11-28T12:55:01.660 に答える
2

私のフォトアルバムは、次の3つの目的でaspectjを使用しています。

  1. オブザーバーの「パターン」を再利用可能なコードとして実装します。
  2. 特定の種類の呼び出しのセッションを破棄します。
  3. ミューテーションが発生したときにDTOにダーティフラグを設定します。

最初の、特に、AOPに関するグーグルの技術的な話からほとんどまっすぐでした。それは、ほとんどの人が考えるのとは異なる方法でのモジュール性についてです。あなたがそれを永久に使う方法に興味があるなら、それを見ることを絶対にお勧めします。

于 2008-11-28T20:43:03.697 に答える
2

トランザクション管理。

私の考えでは、トランザクションの一部である可能性のあるオブジェクトに、それらがトランザクション内にあることを認識させたくありません。AOP を使用すると、トランザクション内のオブジェクトがトランザクション内にあるという事実や AOP フレームワークの存在さえも認識する必要なく、必要に応じてオブジェクトをトランザクションに構成できます。

于 2010-04-08T15:32:09.460 に答える
2

アスペクト指向プログラミングを使用して、キーワード検索エンジンを実装しました。これは実験のようなものでしたが、ロギングとトレース以外の目的で AOP をどのように使用できるかを示しています。

基本的に:
(i) エンジンのユーザーは自分のクラスを KeywordSearchable としてマークします。
(ii) エンジンはこれらの KeywordSearchable インスタンスの作成と破棄の追跡を開始します。
(iii) エンジンはこれらの KeywordSearchable オブジェクトからキーワードを抽出します。
(iv)オブジェクトとキーワードが与えられると、アルゴリズムが検索を処理します。

詳細については、http://montrealistic.blogspot.com/2011/08/aspect-directional-implementation-of.htmlを参照してください。

于 2011-08-01T05:52:16.287 に答える
2

公開不変チェック。PostSharp 1.5 にはアスペクト継承が付属するため、インターフェイスを介しても、多くの新しい機会が提供されます。

于 2008-11-28T11:46:45.853 に答える