面向切面编程基础

23

面向切面编程是一个我很难找到好的信息的主题。我的旧软件工程教材只简单地提到了它(并且含糊不清),我能够找到的维基百科和各种其他教程/文章都给出了极为学术化、高度抽象化的定义,说明它是什么,如何使用它以及何时使用它。这些定义我似乎无法理解。

我(非常有限的)对AOP的理解是,在生产高质量软件系统过程中有许多方面是不能很好地整合在一起的。例如Loggers, Validators, DatabaseQueries等各种类,将在您的代码库中被广泛使用,因此它们之间存在高耦合性。我(再次强调,非常)理解AOP关注于处理这些“普遍耦合”包的最佳实践。

问题:这是真的吗,还是我完全错了?如果我完全错误,可以有人给出一个简明扼要的解释,说明什么是AOP,一个所谓的aspect的例子,并可能提供一个简单的代码示例吗?


5
好问题,提问也很到位。 - jmj
4个回答

13

关注点分离是软件开发中的一个基本原则,David Parnas有一篇经典论文On the Criteria To Be Used in Decomposing Systems into Modules可以介绍这个主题,还可以阅读Uncle Bob's SOLID Principles

但是存在跨领域的问题,它可能包括在许多用例中,例如身份验证、授权、验证、日志记录、事务处理、异常处理、缓存等,这些问题会涉及到软件的所有层。如果你想解决这个问题而不重复劳动并遵守DRY原则,那么你必须以一种复杂的方式来处理它。

你必须使用声明性编程,简单地说,在 .net 中可以通过为方法或属性注释一个特定的Attribute,然后在运行时根据这些注释更改代码的行为。

你可以在Sommerville的软件工程书籍中找到有关此主题的详细章节。

有用的链接:C2 wiki CrossCuttingConcernMSDN如何在面向方面的软件开发中处理横切关注点


Jani - 感谢您提供的有用回复和链接。我需要一些时间来“消化”它们,但我相信周末之后我会有更多有见地的问题。目前我会把这个问题视为已解决,因为随后的问题将更具体。再次感谢! - Eugie
2
在这里有一个很好的解释AOP的例子,可以帮助你更好地理解:https://dev59.com/J3VC5IYBdhLWcg3woCrN#232918 - Sidra Sultana

2

0
AOP 是关于横切关注点,即您需要在整个应用程序中执行的事情。例如日志记录。假设您想要跟踪何时进入和退出方法。使用方面很容易实现这一点。您基本上为事件指定一个“处理程序”,例如进入方法。如果必要,您还可以使用“通配符”指定您感兴趣的方法,然后只需编写处理程序代码,例如记录一些信息。

0

面向切面编程基本上是为了将横切关注点(非功能性)分离出来,并将其作为方面进行开发,例如安全、日志记录、监视等。每当您在应用程序中需要时,将其放在一边,您可以将其用作即插即用。我们唯一能够实现的好处是清晰的代码、更少的代码和程序员可以专注于业务逻辑(核心关注点),从而可以开发出更好的模块化和质量系统。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接