我了解面向对象编程,并且已经写了很长时间的OO程序。人们似乎谈论面向方面的编程,但我从未真正学习过它是什么以及如何使用它。基本范式是什么?
这个问题与此相关,但并没有完全问到:
我了解面向对象编程,并且已经写了很长时间的OO程序。人们似乎谈论面向方面的编程,但我从未真正学习过它是什么以及如何使用它。基本范式是什么?
这个问题与此相关,但并没有完全问到:
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();
}
}
}
然后使用一个方面编织器将代码编译成以下形式:
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在一般的中大型组织中真正有用似乎相当困难。(编辑支持、控制感、从不那么重要的事情开始导致代码腐败、人们回家与家人在一起等等。)
我将我的希望寄托在复合导向编程上,这是越来越现实的东西。它连接了许多流行的想法,并给你带来了真正酷的东西。
看看一个正在崛起的实现:qi4j.org/
附注:实际上,我认为 AOP 的优美之处也是其致命缺点:它是非侵入式的,让人们无视它,因此在大多数组织中将被视为次要问题。
摘自《Spring实战》
AOP通常被定义为一种在软件系统中促进关注点分离的技术。系统由多个组件组成,每个组件负责特定的功能。但是,这些组件通常还承担除其核心功能之外的其他职责。系统服务,如日志记录、事务管理和安全性,经常出现在其核心职责是其他内容的组件中。这些系统服务通常被称为横切关注点,因为它们倾向于跨越系统中的多个组件。
为了完整起见,以下内容翻译自重复内容(爱因斯坦):
经典的例子是安全和日志记录。不要在应用程序中编写代码来记录x的发生或检查对象z是否具有安全访问控制,而是使用一种语言机制“超出”正常代码的范围系统地注入安全或日志记录到不具有它们的例程中,即使您的代码没有提供它 - 它也被处理了。
更具体的例子是操作系统为文件提供访问控制。软件程序不需要检查访问限制,因为底层系统会为其完成这项工作。
如果您认为需要AOP,则根据我的经验,实际上您需要在系统内投入更多的时间和精力,专注于良好的结构/系统设计,并进行适当的元数据管理。
为了完整起见(Buzzer),以下内容是复制的:
.NET中的类和方法属性是一种面向方面编程的形式。您可以使用属性装饰您的类/方法。在幕后,这会向您的类/方法添加代码,执行属性的特定功能。例如,将类标记为可序列化允许自动对其进行序列化,以便存储或传输到另一个系统。其他属性可能会将某些属性标记为不可序列化,这些属性将自动从序列化对象中省略。序列化是一种方面,由系统中的其他代码实现,并通过“配置”属性(装饰)应用于您的类。
AOP是一种更好地模块化应用程序的方式,适用于跨越多个边界的功能。 AOP是另一种封装这些特性并遵循单一职责原则的方法,通过将这些横切关注点(记录日志、错误处理等)移出应用程序的主要组件。当适当使用AOP时,可以提高应用程序随时间推移的可维护性和可扩展性水平。