什么时候应该围绕 - 在同一方面采取行动,何时应该创造不同的方面?

时间:2012-12-12 19:08:41

标签: java aop

我正在学习面向方面编程,当我尝试练习一点时,我意识到我在同一方面设计了不同的方法,我开始想知道这是否是最好的这样做的方式,或者我是否应该为不同的方法创建不同的方面。 我会尝试解释更多我做的事情: 我有两节课:

  1. 计算器类有几种方法,例如添加,乘法,否定,重置等。
  2. AOPmain 类。
  3. 我创建了另一个类( ReturnMessage 类)作为方面,在这个类中我创建了2个方法 - 您可以在下面的代码中看到)(一个)应用于计算器类中的一半方法,第二个用于同一类中的其他一些方法 - 计算器)。 我的问题是:这是一个很好的做法,在一个方面编写几个方法来与其他方法进行交互,或者为它创建不同的方面会更好吗? 以下是方面的代码:

    @Aspect
    public class ReturnMessage {
        //the joinPoint is used to get the method names and args.
        @Before("execution(public void *(double))")
        public void returningMessage( JoinPoint jp) {
            String method = jp.getSignature().getName();
            double value = (Double) jp.getArgs()[0];
            System.out.println("Going to "+method+" "+value);
        }
        @Before("@annotation(lala)")
        public void returnMsg2(MyAnnotation lala) { //<-- should I create another aspect to put this method?
            System.out.println(lala.msg());
        }
    }
    

    我相信它不仅对我有意义,而且对于所有正在开始编程的stackoverflow用户来说都很有趣,所以我希望你们能够做得很好。

3 个答案:

答案 0 :(得分:4)

我会为我想跟踪的每个横切关注点创建一个Aspect。没关系,你的方面有多个切入点/方法。

你可以让一个Aspect负责记录,一个负责指标......

当我使用AoP测量性能时,我发现此链接非常有用。一个现有的应用程序。

它谈论现有代码库的方面,但它可以应用于任何情况。

Applying AspectJ to an Existing Codebase

答案 1 :(得分:1)

即使它们不是传统的对象,Aspects软件组件也应该尊重良好设计的原则 - 包括high cohesion。我不是AspectJ的专家,但是我会说在确定你是否想要为你的方面添加一个方法时,高凝聚力是最重要的事情。

面向方面的编程已经有可能使执行路径更加模糊,所以我不认为将每个方法分成自己的方面都是个好主意。对于将来在同一系统中工作的开发人员来说,这将导致许多游戏“老兄在哪里是我的代码”。我认为将方法组合在一个方面是一个更好的主意,这样它们就更容易找到。

答案 2 :(得分:1)

aspect也是class,而其他人已回答它应该包含相关功能。要解释Cygnusx1,您不希望单个方面具有用于记录和生成度量的建议。

根据他们所针对的切入点,可能需要进一步组织。例如,考虑Logger方面生成多个不同的日志,例如简洁和冗长。

在包com.company.project.logging中创建此方面是有意义的。但是,您是否希望它引用所有代码中需要建议的位置?可能不是。

我要做的是创建一个抽象方面并扩展其中包含具体建议和抽象命名的切入点。然后,我将使用实现这些抽象切入点的各种包com.company.project.dataaccesscom.company.project.purchase等中的具体方面来扩展它。

所以我所做的是暴露了一个方面,它记录并允许各个模块所有者定义何时应该触发这些。