我试图了解AOP中使用的关注点的分离。因此,如果有人能够使用一些基本的HelloWorld示例解释我在AOP中的代码散射和代码纠缠是什么,我将不胜感激。如果一个特定的问题不是系统核心问题而是一个方面,我怎么知道呢?非常感谢。
答案 0 :(得分:8)
我担心我会使用日志记录作为一个例子,这是我们一直使用的例子,但我希望它能让它变得容易理解。考虑这个带有日志记录的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。
现在考虑一个真正的系统,其中有多个类,并且它们都在进行日志记录。现在假设我决定要更改我正在使用的其中一种日志记录方法 - 我希望所有对entering
的调用都更改为info
并包含一些额外信息。恶梦!我的代码库中的日志记录分散。没有一个地方可以做出这种改变,可能有数千个。
如果我在一个方面捕捉到分散的横切关注点,那么只有一个地方可以做出改变。
确定可能是一个方面:
散射可能是一个小规模的问题。也许你的一个类中的每个方法都在重复一些模式,但没有其他类正在使用它。为那些只解决这些方法中的散射的类创建一个小方面没有坏处。