AOPで使用されている問題の分離を理解しようとしています。したがって、基本的なHelloWorldの例を使用して、AOPでコードのばらつきやコードの絡み合いを教えてもらえるかどうかは分かります。どの懸念がシステム中心の懸念事項ではなく、むしろ側面であるかどうかは、後でどのように知ることができますか?どうもありがとう。Aopの散乱と絡み合い
1
A
答えて
4
私はいつも使っているロギングを例として使っていますが、わかりやすく願っています。
public class HelloWorld {
private static Logger logger = Logger.getLogger(HelloWorld.class);
public static void main(String []argv) {
logger.entering("HelloWorld","main");
System.out.println("Hello World");
logger.exiting("HelloWorld","main");
}
}
私のクラスには8行(空白を無視)しかありません - そのうち3つはログに記録され、ほぼ半分です!ロギングは、このクラスの主な目標であるHello World
を印刷することとは関係ありません。ロギングはであり、このクラスの主な目標であるがつぶれています。それを削除して別の方法で表現することができれば、コードの半分が得られ、クラスが主に達成しようとしていることはさらに明確になります。さらに、混乱すると再利用のような機能に悪影響を与える可能性があります。このコードは、ロギングを行わずに、何らかのロギングインフラストラクチャを必要とせずに、helloworldを印刷するために使用することはできません。
ここで、複数のクラスが存在し、すべてがロギングを行っている実際のシステムを考えてみましょう。今私が使用しているロギング方法の1つを変更したいと決めたとします。entering
へのすべての通話をinfo
に変更し、追加情報を追加します。悪夢!私のログはコードベースでに散在しています。この変更を行う場所は1つもなく、何千もあるかもしれません。
私は、ある側面で、そのクロスカッティングされた懸念を捉えた場合、変更を行う場所は1つだけです。側面かもしれないものを識別
:
- は、あなたのクラスの主な機能を考える - 彼らは基本的に用に構築されているものです。そこに厳密に関連していない他のコードがありますが、それを行う必要があることがわかります(たとえば、トランザクションの開始とコミット、セキュリティサービスの認証)。
- あなたは、複数のクラス間で、または1つのクラス内の複数のメソッド間で、非常によく似たことを何度も繰り返し実行しています。
散乱は小規模の懸念事項である可能性があります。たぶんあなたのクラスのいずれかのすべてのメソッドがいくつかのパターンを繰り返しているが、それを使用している他のクラスはありません。これらのメソッド内のばらつきに対処するクラスに対して、小さなアスペクトを作成することには害はありません。