什么是面向方面的编程?

时间:2008-10-28 03:39:46

标签: aop paradigms

我理解面向对象的编程,并且已经编写了OO程序很长一段时间。人们似乎在谈论面向方面的编程,但我从未真正了解它是什么或如何使用它。什么是基本范式?

这个问题是相关的,但并没有提出这个问题:

Aspect-Oriented Programming vs. Object Oriented Programming

8 个答案:

答案 0 :(得分:181)

AOP解决了横切关注点的问题,它可以是在不同方法中重复的任何类型的代码,通常无法完全重构到自己的模块中,例如日志记录或验证。因此,使用AOP,您可以将这些内容从主代码中删除并垂直定义,如下所示:

function mainProgram()
{ 
   var x =  foo();
   doSomethingWith(x);
   return x;
}

aspect logging
{ 
    before (mainProgram is called):
    { 
       log.Write("entering mainProgram");
    }

    after (mainProgram is called):
    { 
       log.Write(  "exiting mainProgram with return value of "
                  + mainProgram.returnValue);
    }
 } 

aspect verification
{ 
    before (doSomethingWith is called):
    { 
       if (doSomethingWith.arguments[0] == null) 
       { 
          throw NullArgumentException();
       }

       if (!doSomethingWith.caller.isAuthenticated)
       { 
          throw Securityexception();
       }
    }
 }

然后使用 aspect-weaver 将代码编译成:

function mainProgram()
{ 
   log.Write("entering mainProgram");

   var x = foo();   

   if (x == null) throw NullArgumentException();
   if (!mainProgramIsAuthenticated()) throw Securityexception();
   doSomethingWith(x);   

   log.Write("exiting mainProgram with return value of "+ x);
   return x;
} 

答案 1 :(得分:12)

不幸的是,在正常的中型大型组织中使AOP真正有用似乎令人惊讶地困难。 (编辑支持,控制感,你从不太重要的事情开始导致代码腐烂,人们回家与家人等等)

我希望面向复合编程,这是越来越现实的事情。它连接到许多流行的想法,给你一些非常酷的东西。

在此处查看即将推出的实施:qi4j.org/

PS。实际上,我认为AOP的美女之一也是它的致命弱点:它是非侵入性的,如果可以的话,让人们忽视它,所以在大多数组织中它将被视为次要问题。

答案 2 :(得分:7)

从复制件复制完整性(爱因斯坦):

经典的例子是安全性和日志记录。不是在你的应用程序中编写代码来记录x的出现或检查对象z的安全访问控制,而是有一个正常代码“带外”的语言装置,它可以系统地注入安全性或登录到不能实际拥有它们的例程中。这样一种方式,即使你的代码不提供它 - 它也会照顾它。

更具体的示例是操作系统为文件提供访问控制。软件程序不需要检查访问限制,因为底层系统可以为它工作。

如果您认为根据我的经验需要AOP,您实际上需要投入更多时间和精力进行系统内适当的元数据管理,重点是经过深思熟虑的结构/系统设计。

答案 3 :(得分:5)

从Spring in Action复制

  

AOP通常被定义为一种促进分离的技术   软件系统中的问题。系统由几个组成   组件,每个组件负责特定的功能。   但这些组件通常还承担着额外的责任   超越其核心功能。日志等系统服务   事务管理和安全性经常进入   其核心职责是其他组件。这些系统   服务通常被称为跨领域问题,因为   他们倾向于跨越系统中的多个组件。

答案 4 :(得分:4)

复制完成后复制(Buzzer):

.NET中的类和方法属性是面向方面编程的一种形式。您使用属性装饰您的类/方法。在幕后,这会为您的类/方法添加代码,以执行属性的特定功能。例如,标记可序列化的类允许它自动序列化以便存储或传输到另一个系统。其他属性可能会将某些属性标记为不可序列化,并且这些属性将自动从序列化对象中省略。序列化是一个方面,由系统中的其他代码实现,并通过应用“配置”属性(装饰)应用于您的类。

答案 5 :(得分:3)

有一个AOP的例子,它以spring AOP为例。这个例子很容易理解。

Spring AOP(面向方面​​编程)框架用于模拟各方面的跨领域问题。简单来说,它只是拦截一些进程的拦截器,例如,当一个方法执行时,Spring AOP可以劫持执行方法,并在方法执行之前或之后添加额外的功能。

参考:http://www.mkyong.com/spring/spring-aop-examples-advice/

答案 6 :(得分:3)

AOP可用于执行与应用程序的业务逻辑无关的操作,例如日志记录,缓存等。这些操作可以放在应用程序的单独部分中,然后在整个应用程序中重复使用。通常有两种方法来实现这一点。在方法之前/之后由预处理器自动注入代码,或附加拦截方法调用的代理类,然后可以在方法调用之前/之后执行事务。

这是.Net中的一个例子。它使用代理类来拦截方法调用 并在saif方法调用之前执行代码。

Aspect Oriented Programming (AOP) in .NET Core and C# using AutoFac and DynamicProxy

答案 7 :(得分:1)

AOP是一种更好地模块化应用程序以跨越多个边界的功能的方法。 AOP是封装这些功能的另一种方法,它通过将这些横切关注点(日志记录,错误处理等)移出应用程序的主要组件来遵循单一责任。如果使用得当,AOP可以在您的应用程序中实现更高水平的可维护性和可扩展性。