AOP 内で使用される懸念の分離を理解しようとしています。したがって、基本的な HelloWorld の例を使用して、AOP でのコードの分散とコードのもつれの意味を誰かが説明してくれれば幸いです。特定の懸念がシステムコアの懸念ではなく、側面である場合、後でどのように知ることができますか? どうもありがとう。
1 に答える
申し訳ありませんが、私たちがいつも使用しているロギングを例として使用しますが、理解しやすいように願っています。ロギングを行うこの helloworld プログラムについて考えてみましょう。
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 つのクラス内の複数のメソッドにわたって、非常に似たようなことを何度も繰り返していることに気づきましたか。
散乱は小規模な問題になる可能性があります。1 つのクラスのすべてのメソッドが何らかのパターンを繰り返している可能性がありますが、他のクラスはそれを使用していません。これらのメソッド内の分散に対処するだけのクラスの小さな側面を作成しても害はありません。