web-dev-qa-db-ja.com

アスペクト指向プログラミングの例

notロギングであるアスペクト指向プログラミング(AOP)の例を誰かが投稿できますか?

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

45
Dave Hillier

これから直接貸与された例の1つ アスペクト指向プログラミング:モジュラー性のラジカル研究、Youtubeビデオ はディスプレイへのペイントでした。この例では、点や形状などで構成される描画プログラムがあり、それらのオブジェクトに変更が加えられた場合は、ディスプレイにそれ自体を更新するように指示する必要があります。ある面でそれを処理しないと、あなたは自分自身をかなり繰り返すことになります。

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

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

33
Bleadof

セキュリティ

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

Asp.net webcontrols/webpartsのよりフレンドリーなエラーメッセージ

パフォーマンス

  • パフォーマンスカウンターを設定するコードを挿入して、アプリが遅い場所の概要を取得します
11
AndreasKnudsen

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

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

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

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

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

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

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

6
namenlos

検証:

[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; }
6
Paco

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

4
orip

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

このホワイトペーパーでは、AspectJを使用してJava)でいくつかのGoFデザインパターンをより適切に実装する方法を示しています。

4
Eyvind

依存性注入

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

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

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

4
wolle23

Javaで多重継承を持つことはできません。ただし、AOPを使用すると、多重継承を「制限」することができます。いくつかの例を見るためにこれをグーグルしてみてください。

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

3
Chrys

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

3
Dan Vinton

AOPの例:

  • 算術式のパーサーおよびエバリュエーター。これはビジターパターンを使用してプログラムできた可能性がありますが、アスペクトがより良い代替手段であると私は信じています。
  • 一部の管理タスク(「ファイルが変更されました」フラグやウィンドウのキャプションの維持など)が個別の側面として扱われる単純なテキストエディタ。
  • 文字列のデータ構造。文字列はツリーとして表されるため、コピーせずに連結と部分文字列の選択を実装できます。効率を維持するために、ツリーのバランスを取り直す必要がある場合があります。バランシングコードはアスペクトとして扱われます。

ドメインモデルのメソッド内にメッセージを記録したいとします。

例:AOPなしのロギング:

namespace Examples\Forum\Domain\Model;

class Forum {

    /**
     * @Flow\Inject
     * @var \Examples\Forum\Logger\ApplicationLoggerInterface
     */
    protected $applicationLogger;

    /**
     * Delete a forum post and log operation
     *
     * @param \Examples\Forum\Domain\Model\Post $post
     * @return void
     */
    public function deletePost(Post $post) {
            $this->applicationLogger->log('Removing post ' . $post->getTitle(), LOG_INFO);
            $this->posts->remove($post);
    }

}

多くの場所でこれを行う必要がある場合、ロギングはドメインモデルロジックの一部になります。モデルにすべてのロギング依存関係を挿入する必要があります。ロギングはドメインモデルが気にする必要のあるものではないため、これは非機能要件の例であり、いわゆる横断的関心事です。

AOPを使用すると、モデル内のコードはロギングについて何も知りません。ビジネスロジックに集中します。

2
Amlesh Kumar

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

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

これについての詳細は http://montrealistic.blogspot.com/2011/08/aspect-directiond-implementation-of.html にあります。

2
Guven

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

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

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

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

2
Dustin

トランザクション管理。

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

1
Alfamale