什么是散射和缠结在一起

时间:2016-05-31 13:52:46

标签: aop aspectj spring-aop cross-cutting-concerns

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

1 个答案:

答案 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并包含一些额外信息。恶梦!我的代码库中的日志记录分散。没有一个地方可以做出这种改变,可能有数千个。

如果我在一个方面捕捉到分散的横切关注点,那么只有一个地方可以做出改变。

确定可能是一个方面:

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

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