什么是面向方面的编程?

Sop*_*hie 219 paradigms aop

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

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

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

Mar*_*ade 189

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();
       }
    }
 }
Run Code Online (Sandbox Code Playgroud)

然后使用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;
} 
Run Code Online (Sandbox Code Playgroud)

  • 巫毒.我认为OOP太过分了. (68认同)
  • Mark,这就像装饰方法的入口和出口点一样吗? (17认同)
  • 那你需要语言支持吗?你的例子是什么语言? (14认同)
  • 这是伪代码,但最着名的例子是AspectJ,它是Java的AOP修改,它使用一种称为cutpoints的类似技术. (8认同)
  • @AidenBell如果远处看不见的动作可以被视为伏都教,那么是的,这是伏都教.在Moose metaprogamming下,[方法修饰符](http://search.cpan.org/~ether/Moose-2.1605/lib/Moose/Manual/MethodModifiers.pod)喜欢*before,after,around,inner,augment*do just确切地说.它模糊了程序的执行流程.这些几乎是不可能追踪的,特别是当它们来自该系统的方面版本时,它称之为[角色](http://search.cpan.org/~ether/Moose-2.1605/lib/Moose/Manual/Roles .荚).人们可以构建具有惊人复杂性的系统. (3认同)
  • @Filip如果它是为了拦截或插入那些点的代码那么可以被认为是AOP. (2认同)
  • @ Harshakj89:不,他们是两个不相关的概念 (2认同)

Hug*_*ugo 14

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

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

看一下即将到来的实现:qi4j.org/

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

  • 不过,它仍然包含一些非常有效的点 (2认同)

pax*_*blo 8

复制完成后复制(爱因斯坦):

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

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

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


小智 6

复制自Spring in Action

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


pax*_*blo 5

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

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


R.F*_*R.F 5

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

\n\n

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

\n\n

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

\n


Car*_*nco 5

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

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

使用AutoFac和DynamicProxy在.NET Core和C#中进行面向方面的编程(AOP)