4

私は現在アスペクト指向プログラミングを勉強していて、少し練習しようとしていたときに、同じアスペクトでさまざまなメソッドを設計していることに気付き、これが最善の方法なのか、それとも作成する必要があるのか​​疑問に思い始めました。さまざまな方法のさまざまな側面。私がしたことをもっと説明しようと思います:私は2つのクラスを持っていました:

  1. 電卓クラスには、add、multiply、negate、resetなどのいくつかのメソッドがありました。
  2. AOPmainクラス。

アスペクトとして別のクラス(ReturnMessageクラス)を作成し、このクラスで2つのメソッドを作成しました-以下のコードでわかるように)(1つはCalculatorクラスにあるメソッドの半分に適用され、2つ目は同じクラスの他のメソッドの1つ-Calculator)。私の質問は次のとおりです。他のメソッドと相互作用するアスペクトでいくつかのメソッドを作成するのは良い習慣ですか、それとも異なるアスペクトを作成する方が良いでしょうか?これが私のアスペクトのコードです:

@Aspect
public class ReturnMessage {
    //the joinPoint is used to get the method names and args.
    @Before("execution(public void *(double))")
    public void returningMessage( JoinPoint jp) {
        String method = jp.getSignature().getName();
        double value = (Double) jp.getArgs()[0];
        System.out.println("Going to "+method+" "+value);
    }
    @Before("@annotation(lala)")
    public void returnMsg2(MyAnnotation lala) { //<-- should I create another aspect to put this method?
        System.out.println(lala.msg());
    }
}

それは私だけでなく、aopでプログラミングを始めているstackoverflowのすべてのユーザーにとっても興味深いものになると思いますので、皆さんが忍耐強くなってくれることを願っています。

4

3 に答える 3

4

追跡したい分野横断的な懸念事項ごとにアスペクトを作成します。アスペクトに複数のポイントカット/メソッドを含めることは問題ありません。

ロギングを担当するアスペクト、メトリックなどを担当するアスペクトを持つことができます...

AoP を使用してパフォーマンスを測定したときに、このリンクが非常に役立つことがわかりました。既存のアプリの。

既存のコードベースに対する側面について話しますが、それはどのような場合にも適用できます。

AspectJ を既存のコードベースに適用する

于 2012-12-12T19:23:08.693 に答える
1

それらが従来のオブジェクトでなくても、アスペクトはソフトウェアコンポーネントであり、高い凝集度を含む優れた設計の原則を尊重する必要があります。私はAspectJの専門家ではありませんが、アスペクトにメソッドを追加するかどうかを決定する際には、高い凝集度を念頭に置くことが最も重要だと思います。

アスペクト指向プログラミングは、実行パスをもう少しわかりにくくする可能性があるため、すべてのメソッドを独自のアスペクトに分離することは良い考えではないと思います。それは、同じシステムで作業する将来の開発者のために、「私のコードはどこにあるのか」という多くのゲームにつながるでしょう。メソッドをアスペクトでグループ化して、見つけやすくする方がよいと思います。

于 2012-12-12T19:29:30.303 に答える
1

aspectもあり、他のclass人が答えたように、関連する機能で構成する必要があります。Cygnusx1 を言い換えると、メトリックの生成だけでなくログ記録についても、単一のアスペクトにアドバイスを与える必要はありません。

対象とするポイントカットに基づいて、さらに組織化が必要になる場合があります。たとえば、Loggerアスペクトが複数の異なるログ (簡潔なログと詳細なログなど) を生成するとします。

パッケージでこのアスペクトを作成することは理にかなっていますcom.company.project.logging。しかし、アドバイスが必要なコード内のすべての場所を参照したいですか? おそらくそうではありません。

私がすることは、具体的なアドバイスと抽象的な名前付きポイントカットを含む抽象的な側面と拡張を作成することです。com.company.project.dataaccess次に、com.company.project.purchaseこれらの抽象的なポイントカットを実装するさまざまなパッケージなどの具体的な側面でこれを拡張します。

そのため、私が行ったことは、ロギングを行う側面を公開し、個々のモジュール所有者がこれらをいつトリガーするかを定義できるようにすることです。

于 2012-12-12T20:06:21.420 に答える