面向方面的编程是否有助于提供基于接口的编程的实现?

时间:2010-01-31 03:25:35

标签: design-patterns interface aop

我对这个问题很好奇。我从未使用过面向方面的编程(故意),而且我对它只有少量的知识。

这是我的问题(使用日志记录作为典型用例):

如果我有一个现有的基于接口的范例,例如考虑伪代码

class MyClass implements Loggable {

  // Logable Implementation
  string Log() { return somelogstring;}
}

面向方面编程可以像

一样使用
class MyClass implements Loggable with LoggingAspect {

  // No explicit Loggable implemenation
}

这是否会被视为AOP?如果是这样,这是一种有效的使用方法吗?

4 个答案:

答案 0 :(得分:1)

你在这说什么语言?

不,这不是AOP通常如何完成的,而且在使用这种框架的语言(C#,.NET)中可能不可能。

你在这里谈论的是一个预构建阶段,即你的代码现在不能编译,你需要在将它发送到实际的编译器之前进行编译...... AKA作为代码生成。代码生成是一件好事,并且有各种语言的框架(所以再次告诉我们什么语言)。

但它是AOP吗?否。

AOP是关于将功能注入已有的方法中。即“挂钩”功能/行动等。

答案 1 :(得分:1)

AOP通常是在不影响这些程序的实施的情况下,在一系列程序中应用交叉问题。审计日志是一个很好的例子。您可以定义一个方面,说明“应记录影响客户帐户的所有操作”。您可以在与帐户一起使用的所有操作中以程序方式实现此操作,或者您可能希望将此代码拉到一边。

这通常是通过在现有代码周围插入行为来实现的。在OO中,可以通过代理模式应用这些方面。大多数C#和Java AOP框架将在运行时基于目标类中的元数据生成代理类,并导致某些代码在指定方法之前和之后运行。

许多IoC容器提供了附加这些方面的功能,方面,方法拦截和依赖注入的概念比以前更难区分。

答案 2 :(得分:1)

创建AOP是为了实现横切关注点(如日志记录),这些问题会在应用程序的各个模块之间“削减”。例如,如果使用AspectJ实现Logging,则会有如下方面:

public aspect Logging(){

    pointcut traceMethods()  : (execution(* *.*(..)) && !within(Logging);

    before(): traceMethods() {
         // Perform log here!
    }

}

此代码将在执行应用程序的所有类之前实现日志功能。因此,它将插入记录您想要的某些类的行为。要指出哪些类会受到日志记录的影响,您应该定义切入点(或一组pointcus)。在此示例中,切入点是traceMethods()。

考虑接口,你应该看this link that explains Inter-type declarations。这个声明可以用来“实现”类似于使用AspectJ的接口。

答案 3 :(得分:0)

不,这不是AOP的真正含义。 AOP不是用于在运行时实现接口,而是用于组合系统:业务逻辑可以在一个地方定义,例如,另一个和AOP框架中的日志逻辑将组合成一个更大的系统。 AOP旨在涵盖它所指的横切关注点,即系统内许多对象所需的功能,但不是这些对象关注的核心。

AOP的工作原理是拦截对象上方法的调用,并执行某些操作,或者代替拦截方法执行的操作。截取点称为切入点,截取的方法是建议的方法,在截取的方法上建议的代码被称为通知。

我只是通过Spring.Net的AOP框架熟悉AOP,它允许您通过配置文件和编程方式指定和应用切入点和建议。 Spring.Net AOP有四种类型的建议:before,after,around和throws,它们在调用建议方法之前调用建议方法,调用之后调用,调用之前和之后以及抛出异常时调用分别。无论是通过配置还是以编程方式应用,建议的方法都不了解Spring.Net AOP,甚至不知道它已被建议。但是,建议的方法必须有某种实现来拦截,所以你的例子不起作用。

Spring.Net文档非常易读,非常擅长解释AOP,特别是Spring.Net的AOP实现,并包含许多示例。即使只是为了更好地理解AOP,也值得一看。