【问题标题】:What is aspect-oriented programming?什么是面向方面编程?
【发布时间】:2010-09-19 12:31:51
【问题描述】:

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

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

Aspect-Oriented Programming vs. Object Oriented Programming

【问题讨论】:

  • IMAO,问题中提供的链接比这里接受的答案更清晰,更彻底。阅读此问题的人可能会先阅读它。

标签: aop paradigms


【解决方案1】:

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

【讨论】:

  • 那么您需要语言支持吗?你的例子是什么语言的?
  • 这是伪代码,但最著名的例子是 AspectJ,它是对 Java 的 AOP 修改,它使用了一种称为 cutpoints 的类似技术。
  • 巫毒教。而且我认为 OOP 太过分了。
  • 马克,这就像装饰方法的入口和出口点吗?
  • @AidenBell 如果远处看不见的动作可以被视为伏都教,那么是的,它是伏都教。在 Moose 元编程下,method modifiers 就像 before、after、around、inner、augment 正是这样做的。它掩盖了程序的执行流程。这些几乎是不可能追踪的,尤其是当它们来自该系统的方面版本时,它称为roles。一个人可以用这一切组成复杂得惊人的系统。
【解决方案2】:

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

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

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

【讨论】:

  • 在计算中,面向方面编程 (AOP) 是一种编程范式,旨在通过允许分离横切关注点来增加模块化。
【解决方案3】:

复制自 Spring in Action

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

【讨论】:

    【解决方案4】:

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

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

    在这里查看即将推出的实现:qi4j.org/

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

    【讨论】:

      【解决方案5】:

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

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

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

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 2011-07-09
            • 1970-01-01
            • 2011-11-30
            • 2011-06-29
            • 1970-01-01
            • 2010-10-26
            • 1970-01-01
            • 2010-09-18
            • 2010-11-24
            相关资源
            最近更新 更多