代码之家  ›  专栏  ›  技术社区  ›  sylvanaar

面向方面编程对于提供基于接口编程的实现有用吗?

  •  0
  • sylvanaar  · 技术社区  · 14 年前

    我只是好奇这个问题。我从未(有意)使用面向方面的编程,而且我对它只有很少的了解。

    以下是我的问题(使用日志作为典型用例):

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

    class MyClass implements Loggable {
    
      // Logable Implementation
      string Log() { return somelogstring;}
    }
    

    面向方面的编程可以像这样使用吗?

    class MyClass implements Loggable with LoggingAspect {
    
      // No explicit Loggable implemenation
    }
    

    那是不是应该被视为AOP?如果是的话,这是一种有效的使用方法吗?

    4 回复  |  直到 14 年前
        1
  •  1
  •   Pedro Ghilardi    14 年前

    创建AOP是为了实现横切关注点(如日志记录),即在应用程序的各个模块之间“切割”关注点。例如,如果使用AspectJ实现日志记录,您将具有如下方面:

    public aspect Logging(){
    
        pointcut traceMethods()  : (execution(* *.*(..)) && !within(Logging);
    
        before(): traceMethods() {
             // Perform log here!
        }
    
    }
    

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

    思考你应该看的界面 this link that explains Inter-type declarations . 此声明可以用于“实现”类似使用AspectJ的接口的东西。

        2
  •  1
  •   Noon Silk    14 年前

    你在说什么语言?

    不,这不是AOP一般的实现方式,在使用这种框架的语言(c,.net)中可能不可能实现。

    您在这里所说的是一个预构建阶段,即,您有一些现在不编译的代码,您需要在将其发送到实际编译器之前使其编译…又称为代码生成。代码生成是一件很好的事情,它有各种语言的框架(再次告诉我们什么语言)。

    但它是AOP吗?不。

    AOP是将功能注入到已经存在的方法中。即“挂钩”功能/动作等。

        3
  •  1
  •   BnWasteland    14 年前

    AOP通常是在不影响这些程序实施的情况下跨过程应用交叉关注。审计日志就是一个很好的例子。您可以定义一个方面,该方面表示“应记录所有影响客户帐户的操作”。您可以在使用帐户的所有操作中实现此过程,或者您可能希望将此代码拉到一边。

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

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

        4
  •  0
  •   Alfamale    14 年前

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

    AOP的工作方式是截取对对象方法的调用,并执行一些操作,而不是执行被截取方法执行的操作。拦截点称为切入点,拦截方法称为建议方法,拦截方法上的代码称为建议。

    我只熟悉Spring.net的AOP框架,它允许您通过配置文件和编程方式指定和应用切入点和通知。NET AOP有四种类型的通知:before、after、around和throw,在调用advised方法之前、调用之后、调用之前和之后以及分别引发异常时,在拦截advised方法时调用它们。无论是通过配置应用还是通过编程应用,建议的方法都不知道Spring.NET AOP,甚至不知道它已经被建议了。但是,建议的方法必须有某种实现来拦截,这样您的示例就不会工作。

    Spring.NET文档非常易读,并且非常擅长解释AOP的一般情况,尤其是Spring.NET对AOP的实现,并且包含许多示例。即使只是为了更好地理解AOP,也值得一看。