什么是散射和缠结在一起

use*_*220 4 aop aspectj cross-cutting-concerns spring-aop

我试图理解AOP中使用的关注点的分离.因此,如果有人能够使用一些基本的HelloWorld示例解释我在AOP中的代码散射和代码纠缠是什么,我将不胜感激.如果一个特定的问题不是系统核心问题而是一个方面,我怎么知道呢?非常感谢.

小智 10

我担心我会使用日志记录作为一个例子,这是我们经常使用的例子,但我希望它能让它易于理解.考虑这个带有日志记录的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");
  }
}
Run Code Online (Sandbox Code Playgroud)

我的班级只有8行(忽略空格) - 其中3行记录,差不多一半!日志记录与此类打印的主要目标无关Hello World.记录与此类的主要目标纠缠在一起.如果我们可以删除它并以另一种方式表达它,那么我们将拥有一半的代码,并且该类主要尝试实现的内容将更加清晰.另外,纠缠不清可能会损害重用等功能 - 如果没有执行某些日志记录并需要某种日志记录基础结构,则此代码不能用于打印helloworld.

现在考虑一个真正的系统,其中有多个类,并且它们都在进行日志记录.现在假设我决定要更改我正在使用的一种日志记录方法 - 我希望所有的调用都entering更改为info并包含一些额外的信息.恶梦!我的日志记录分散在我的代码库中.没有一个地方可以做出这种改变,可能有数千个.

如果我在一个方面捕获了分散的横切关注点,那么只有一个地方可以进行更改.

确定可能是一个方面:

  • 考虑你的类的主要功能 - 它们从根本上构建的是什么.是否有其他代码与此没有严格关联,但您发现需要这样做(例如,开始并提交事务,使用某些安全服务进行身份验证).
  • 你是否发现自己一遍又一遍地做一个非常相似的事情 - 要么跨越多个类,要么只是在一个类中的多个方法.

散射可能是一个小规模的问题.也许你的一个类中的每个方法都在重复一些模式,但没有其他类正在使用它.在为这些方法中的散射解决问题的类中创建一个小方面没有坏处.