4

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

  1. Calculator类有多种方法,如加法、乘法、求反、重置等。
  2. AOPmain类。

我创建了另一个类(ReturnMessage类)作为方面,在这个类中我创建了 2 个方法 - 正如您在下面的代码中看到的那样)(一个应用于Calculator类中的一半方法,第二个应用于一个用于同一类中的其他一些方法 - Calculator)。我的问题是:在一个方面编写多个方法以与其他方法进行交互是一种好习惯,还是为它创建不同的方面会更好?这是我方面的代码:

@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());
    }
}

我相信这不仅对我来说会很有趣,而且对所有开始使用 aop 编程的 stackoverflow 用户都会很有趣,所以我希望你们保持冷静。

4

3 回答 3

4

我会为我想要跟踪的每个横切关注点创建一个方面。可以,在您的方面有多个切入点/方法。

你可以有一个负责记录的方面,一个负责指标等...

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

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

将 AspectJ 应用于现有代码库

于 2012-12-12T19:23:08.693 回答
1

即使它们不是传统的对象,方面也是软件组件,应该尊重良好设计的原则——包括高内聚。我不是 AspectJ 专家,但我想说,在决定是否要向方面添加方法时,最重要的是要牢记高内聚力。

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

于 2012-12-12T19:29:30.303 回答
1

Anaspect也是 aclass并且正如其他人所回答的那样,它应该包含相关的功能。套用 Cygnusx1 的话说,您不希望单个方面有日志记录和生成指标的建议。

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

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

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

因此,我所做的是公开了一个执行日志记录的方面,并允许各个模块所有者定义何时应该触发这些。

于 2012-12-12T20:06:21.420 回答