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