我理解面向对象的编程,并且已经编写了OO程序很长一段时间。人们似乎在谈论面向方面的编程,但我从未真正了解它是什么或如何使用它。什么是基本范式?
这个问题是相关的,但并没有提出这个问题:
答案 0 :(得分:181)
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;
}
答案 1 :(得分:12)
不幸的是,在正常的中型大型组织中使AOP真正有用似乎令人惊讶地困难。 (编辑支持,控制感,你从不太重要的事情开始导致代码腐烂,人们回家与家人等等)
我希望面向复合编程,这是越来越现实的事情。它连接到许多流行的想法,给你一些非常酷的东西。
在此处查看即将推出的实施:qi4j.org/
PS。实际上,我认为AOP的美女之一也是它的致命弱点:它是非侵入性的,如果可以的话,让人们忽视它,所以在大多数组织中它将被视为次要问题。
答案 2 :(得分:7)
从复制件复制完整性(爱因斯坦):
经典的例子是安全性和日志记录。不是在你的应用程序中编写代码来记录x的出现或检查对象z的安全访问控制,而是有一个正常代码“带外”的语言装置,它可以系统地注入安全性或登录到不能实际拥有它们的例程中。这样一种方式,即使你的代码不提供它 - 它也会照顾它。
更具体的示例是操作系统为文件提供访问控制。软件程序不需要检查访问限制,因为底层系统可以为它工作。
如果您认为根据我的经验需要AOP,您实际上需要投入更多时间和精力进行系统内适当的元数据管理,重点是经过深思熟虑的结构/系统设计。
答案 3 :(得分:5)
从Spring in Action复制
AOP通常被定义为一种促进分离的技术 软件系统中的问题。系统由几个组成 组件,每个组件负责特定的功能。 但这些组件通常还承担着额外的责任 超越其核心功能。日志等系统服务 事务管理和安全性经常进入 其核心职责是其他组件。这些系统 服务通常被称为跨领域问题,因为 他们倾向于跨越系统中的多个组件。
答案 4 :(得分:4)
复制完成后复制(Buzzer):
.NET中的类和方法属性是面向方面编程的一种形式。您使用属性装饰您的类/方法。在幕后,这会为您的类/方法添加代码,以执行属性的特定功能。例如,标记可序列化的类允许它自动序列化以便存储或传输到另一个系统。其他属性可能会将某些属性标记为不可序列化,并且这些属性将自动从序列化对象中省略。序列化是一个方面,由系统中的其他代码实现,并通过应用“配置”属性(装饰)应用于您的类。
答案 5 :(得分:3)
有一个AOP的例子,它以spring AOP为例。这个例子很容易理解。
Spring AOP(面向方面编程)框架用于模拟各方面的跨领域问题。简单来说,它只是拦截一些进程的拦截器,例如,当一个方法执行时,Spring AOP可以劫持执行方法,并在方法执行之前或之后添加额外的功能。
答案 6 :(得分:3)
AOP可用于执行与应用程序的业务逻辑无关的操作,例如日志记录,缓存等。这些操作可以放在应用程序的单独部分中,然后在整个应用程序中重复使用。通常有两种方法来实现这一点。在方法之前/之后由预处理器自动注入代码,或附加拦截方法调用的代理类,然后可以在方法调用之前/之后执行事务。
这是.Net中的一个例子。它使用代理类来拦截方法调用 并在saif方法调用之前执行代码。
Aspect Oriented Programming (AOP) in .NET Core and C# using AutoFac and DynamicProxy
答案 7 :(得分:1)
AOP是一种更好地模块化应用程序以跨越多个边界的功能的方法。 AOP是封装这些功能的另一种方法,它通过将这些横切关注点(日志记录,错误处理等)移出应用程序的主要组件来遵循单一责任。如果使用得当,AOP可以在您的应用程序中实现更高水平的可维护性和可扩展性。