ロギングしていないアスペクト指向プログラミング (AOP) の例を誰か投稿できますか?
いくつかのリソースを見てきましたが、すべての例は些細なロギングです。それは何に役立ちますか?
このAspect Oriented Programming: Radical Research in Modularity, Youtube ビデオから直接借用した例の 1 つは、ディスプレイへのペイントでした。この例では、点や形状などで構成される描画プログラムがあり、これらのオブジェクトが変更された場合は、ディスプレイ自体を更新するように指示する必要があります。ある側面でそれを処理しないと、かなりのことを繰り返すことになります。
私が理解しているように、AOP は、ビジネス ロジックとは何の関係もないかもしれない分野横断的な懸念事項について自分自身を繰り返さないために作成されました。アスペクトを使用すると、これらの懸念をアスペクトにモジュール化できます。例の 1 つはログ記録でしたが、繰り返しになる可能性のあるさまざまなことがたくさんあります。それ以来進化しており、もはやアスペクト指向プログラミングではなく、アスペクト指向モデリングもあります。
アスペクト指向プログラミングの詳細については、次のソースを参照してください。
安全
asp.net webcontrols/webparts のわかりやすいエラー メッセージ
パフォーマンス
元に戻す - 元に戻す操作をサポートするサードパーティのアセンブリを呼び出しています。呼び出し元は、元に戻すコンテキストを作成し、アセンブリ内のいくつかのメソッドを呼び出してから、元に戻すコンテキストを破棄する必要があります。コンテキストはネストできます。また、コンテキストが作成されたが、アプリの再起動が必要な望ましくない状態のままになっている場合。
通常、元に戻すには、次のように記述します
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 コンテキストが確実にクリーンアップされるようにするため、これを実装するのは私が示しているよりも少し複雑ですが、アイデアは理解できます。
検証:
[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; }
依存性注入
厳密に言えば、依存性注入は分野横断的な問題にすぎません。多くの依存性注入フレームワークは、次のような属性ベースのプログラミング スタイルを使用します。
public class Car:IDisposable
{
[Inject]
public IGearBox Gearbox { get; set; }
...
}
[Inject] 属性は、外部フレームワークに依存しないアスペクトとして設計することもできます。
もう 1 つの典型的な例 (ロギングなど) はキャッシュです。しかし、他の例はもっと興味深いものです。
JavaおよびAspectJ(HannemannおよびKiczales)でのデザインパターンの実装:http ://www.cs.ubc.ca/labs/spl/papers/2002/oopsla02-patterns.pdf
このペーパーは、AspectJを使用してJavaでいくつかのGoFデザインパターンをより良い方法で実装する方法を示しています
セキュリティ - 特定のメソッドを実行する前に、ユーザーが適切な権限を持っていることを確認します。
Java では多重継承を行うことはできません。ただし、AOP を使用すると、「限定的な」多重継承を行うことができます。これをグーグルで検索して、いくつかの例を確認してください。
私もEyvidに同意します。Hannemann と Kiczales の論文は、デザイン パターンの基礎を学び、優れた AOP の例を得るのに最適です。
私のフォトアルバムは、次の3つの目的でaspectjを使用しています。
最初の、特に、AOPに関するグーグルの技術的な話からほとんどまっすぐでした。それは、ほとんどの人が考えるのとは異なる方法でのモジュール性についてです。あなたがそれを永久に使う方法に興味があるなら、それを見ることを絶対にお勧めします。
トランザクション管理。
私の考えでは、トランザクションの一部である可能性のあるオブジェクトに、それらがトランザクション内にあることを認識させたくありません。AOP を使用すると、トランザクション内のオブジェクトがトランザクション内にあるという事実や AOP フレームワークの存在さえも認識する必要なく、必要に応じてオブジェクトをトランザクションに構成できます。
アスペクト指向プログラミングを使用して、キーワード検索エンジンを実装しました。これは実験のようなものでしたが、ロギングとトレース以外の目的で AOP をどのように使用できるかを示しています。
基本的に:
(i) エンジンのユーザーは自分のクラスを KeywordSearchable としてマークします。
(ii) エンジンはこれらの KeywordSearchable インスタンスの作成と破棄の追跡を開始します。
(iii) エンジンはこれらの KeywordSearchable オブジェクトからキーワードを抽出します。
(iv)オブジェクトとキーワードが与えられると、アルゴリズムが検索を処理します。
詳細については、http://montrealistic.blogspot.com/2011/08/aspect-directional-implementation-of.htmlを参照してください。
公開不変チェック。PostSharp 1.5 にはアスペクト継承が付属するため、インターフェイスを介しても、多くの新しい機会が提供されます。