2016-05-31 45 views
1

我想了解AOP中使用的问题的分离。因此,如果有人能够解释我使用一些基本的HelloWorld示例代码散布和代码在AOP中缠绕是什么,我将不胜感激。事后我会怎么知道一个给定的问题不是系统核心问题,而是一个方面?非常感谢。什么是aop中的散射和缠结

回答

4

恐怕我会用日志记录作为例子,这是我们经常使用的一个例子,但我希望它能够让我们很容易理解。考虑这个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并包含一些额外的信息。恶梦!我的日志记录是分散在我的代码库中的。没有一个地方可以做出这种改变,可能会有成千上万。

如果我在一个方面捕捉到分散的横切关注点,那么只会有一个地方进行更改。

确定什么可能是一个方面:

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

散射可能是一个小规模的问题。也许每个类中的每个方法都重复某种模式,但没有其他类正在使用它。在为这个课程创建一个小方面,而不是仅仅解决这些方法中的散布问题上没有什么坏处