什么是面向方面的编程?

我理解面向对象的编程,并且一直在写OO程序。 人们似乎谈论面向方面的编程,但我从来没有真正学过什么或如何使用它。 什么是基本范式?

这个问题是相关的,但并不完全问:

面向方面编程与面向对象编程

AOP解决了横切关注点的问题 ,这个问题可能是任何一种以不同方法重复的代码,通常不能被完全重构到自己的模块中,就像logging或validation一样。 所以,使用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; } 

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

我把我的希望寄托在面向复合的编程上 ,这是越来越现实的东西。 它连接到许多stream行的想法,并给你一些非常酷的东西。

看看这里即将推出的实施: qi4j.org/

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

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

经典的例子是安全和日志logging。 代替在应用程序中编写代码来loggingx的出现或者检查对象z以进行安全访问控制,而是有一种正常代码的“带外”语言工具,它可以系统地将安全性或日志logging插入到不常用的例程中即使你的代码没有提供这种方式 – 它的照顾。

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

如果您认为在我的经验中您需要AOP,您实际上需要投入更多的时间和精力在您的系统中进行适当的元数据pipe理,重点放在精心思考的结构/系统devise上。

复制完成后复制(Buzzer):

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

spring在行动中复制

AOP通常被定义为一种促进软件系统中问题分离的技术。 系统由多个组件组成,每个组件负责特定的function。 但是这些组件通常还会在核心function之外承担额外的责任。 系统服务(如日志logging,事务pipe理和安全性)通常会发现他们的核心职责是其他组件的方式。 这些系统服务通常被称为交叉问题,因为它们倾向于跨越系统中的多个组件。

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

Spring AOP(面向方面​​编程)框架用于模块化方面的交叉问题。 简单来说,它只是拦截一些进程的拦截器,例如,当方法执行时,Spring AOP可以劫持正在执行的方法,并在方法执行之前或之后添加额外的function。

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

AOP是更好地模块化跨越多个边界的function的应用程序的一种方式。 AOP是封装这些function的另一种方法,通过将这些横切关注(日志logging,error handling等)移出应用程序的主要组件,遵循“单一责任”(Single Responsiblity)。 如果使用得当,AOP可以在一段时间内提高应用程序的可维护性和可扩展性。