252

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

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

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

4

7 回答 7

213

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;
} 
于 2008-10-28T03:46:05.267 回答
13

不幸的是,要让 AOP 在正常的中大型组织中真正有用似乎非常困难。(编辑支持、控制感、从导致代码腐烂的不那么重要的事情开始的事实、人们回家回家等等)

我把希望寄托在面向复合的编程上,这是越来越现实的东西。它连接了许多流行的想法,并为您提供了一些非常酷的东西。

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

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

于 2008-10-28T04:07:36.517 回答
9

复制自 Spring in Action

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

于 2015-09-15T09:27:49.497 回答
8

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

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

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

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

于 2008-11-26T04:28:23.910 回答
6

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

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

于 2008-11-26T04:27:50.450 回答
4

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

于 2008-10-28T03:52:12.680 回答
4

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

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

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

于 2016-04-24T15:23:42.027 回答