9

Omar Al Zabirは、「AOPスタイルのコーディングを行うためのより簡単な方法」を探しています。

彼はAspectFと呼ばれるフレームワークを作成しました。これは、「コードにアスペクトを追加するための流暢で簡単な方法」です。

コンパイル時やランタイムウィービングを行わないため、これは真のAOPではありませんが、AOPと同じ目標を達成しますか?

AspectFの使用例を次に示します。

    public void InsertCustomerTheEasyWay(string firstName, string lastName, int age,
        Dictionary<string, string> attributes)
    {
        AspectF.Define
            .Log(Logger.Writer, "Inserting customer the easy way")
            .HowLong(Logger.Writer, "Starting customer insert", "Inserted customer in {1} seconds")
            .Retry()
            .Do(() =>
                {
                    CustomerData data = new CustomerData();
                    data.Insert(firstName, lastName, age, attributes);
                });
    }

AspectFの目的をさらに明確にする著者によるいくつかの投稿は次のとおりです。

著者によると、AspectFはAOPの代替として設計されているのではなく、「関心の分離を実現し、コードをきれいに保つ」方法であると私は考えています。

いくつかの考え/質問:

  • プロジェクトの成長に合わせてこのスタイルのコーディングを使用することについて何か考えはありますか?
  • それはスケーラブルなアーキテクチャですか?
  • パフォーマンスの懸念?
  • 保守性は、真のAOPソリューションとどのように比較されますか?
4

2 に答える 2

5

私はプロジェクトを打ち負かすつもりはありませんが、私見ではこれはAOPを悪用しています。アスペクトはすべてに適しているわけではなく、このように使用すると読みやすさが妨げられるだけです。

さらに、これは、基礎となるコードに触れることなくアスペクトを追加/削除/再定義できるというAOPの主要なポイントの1つを見逃していると思います。

アスペクトを真に横断的関心事にするために、影響を受けるコードの外部でアスペクトを定義する必要があります。AspectFの場合、アスペクトは影響を受けるコードに埋め込まれているため、 SoC / SRPに違反します。

codeprojectの記事で説明されているように、実行時のIL操作がないため、パフォーマンス面ではペナルティはありません(または無視できます)。ただし、CastleDynamicProxyでパフォーマンスの問題が発生したことはありません。

于 2009-11-02T17:30:02.380 に答える
3

最近のプロジェクトでは、AspectFを試してみることが勧められました。私は、すべての懸念事項を前もって置き、実際の作業を実行するコードを、その外部で発生したすべてのチェックとバランスに気付かずに幸福にするという考えを心に留めました。

私は実際にそれをもう少し進めて、WCF要求の一部として受信されていた資格情報を必要とするセキュリティ「懸念」を追加しました。それはデータベースに行き、それがしなければならなかったことをしました。必要なデータを返す実際のコードを実行する前に、明らかな検証とセキュリティチェックを行いました。

このアプローチは非常に新鮮な変更であることがわかりました。サービス呼び出しのデバッグとテストを行っているときに、AspectFのソースをウォークスルーできるのが確かに気に入りました。

オフィスでは、これらの懸念はクラス/メソッドの装飾として実装されるべきであると主張する人もいました。しかし、それをどこに飾るかは実際には重要ではありません。どこかの時点で、特定のアクション/チェックを実行したいと言う必要があります。別のコードファイルとしてではなく、ある種の構成ファイルとしてではなく、クラス/メソッドにさらに別の装飾を追加しないで、すべてがインプレースに配置されているという事実が気に入っています。

私はそれが本当のAOPだと言っているわけではありません-そして私は確かにそれがあなたの目的を実装する最良の方法ではない解決策と状況があると思います、しかしそれがほんの数Kのソースファイルであることを考えると、それは非常に軽量な実装。

AspectFは基本的に、デリゲートをチェーン化する非常に巧妙な方法です。すべての開発者がコードを見て、それがどれほど素晴らしいかを言うとは思いません。実際、私たちのオフィスでは、私たちの一部を混乱させました。しかし、何が起こっているのかを理解すれば、それは他のアプローチでもできることの多くを達成するための安価な方法です。

于 2011-09-09T13:32:58.550 に答える