什么是面向方面编程?

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

这个问题是相关的,但并没有完全问出来:

面向方面编程vs面向对象编程

85602 次浏览

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;
}

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

不幸的是,让AOP在一个中等规模的组织中真正有用似乎非常困难。(编辑器的支持,控制感,事实上你从不那么重要的事情开始导致代码崩溃,人们回家找家人,等等。)

我把我的希望放在面向组合的编程,这是越来越现实的东西。它连接了许多流行的想法,给你一些非常酷的东西。

看看这里即将实现的qi4j.org/

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

为了完整性,从副本中复制(蜂鸣器):

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

为了完整性,从副本中复制(爱因斯坦):

经典的例子是安全性和日志记录。不是在应用程序中编写代码来记录x的发生或检查对象z的安全访问控制,而是有一种正常代码的“带外”语言装置,它可以系统地将安全性或登录到本地没有它们的例程中,即使您的代码没有提供它——它也会得到照顾。

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

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

复制自Spring in Action

AOP通常被定义为一种促进分离的技术 软件系统中的关注点。系统由几个部分组成 组件,每个组件负责特定的功能部分。 但通常这些组件还承担着额外的责任 超出其核心功能。系统服务,如日志记录、 事务管理和安全性通常会进入 其核心职责是其他内容的组件。这些系统 服务通常被称为横切关注点,因为 它们倾向于跨越系统中的多个组件。

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

Spring AOP(面向方面编程)框架用于模块化方面中的横切关注点。简单地说,它只是一个拦截器来拦截一些进程,例如,当一个方法被执行时,Spring AOP可以劫持正在执行的方法,并在方法执行之前或之后添加额外的功能。

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