面向方面编程简介
目录
1. 面向切面编程的定义
2. 用Javascript应用AOP
3. AOP核心概念详解
4. 关于 AOP 的几点思考
面向方面的编程定义
在计算中,面向方面编程(AOP)是一种编程范式,旨在通过允许分离横切关注点来增加模块化。
交叉问题是影响其他问题的程序的各个方面。在设计和实现中,这些问题通常无法从系统的其余部分清楚地分解出来,并且可能导致分散(代码重复)、混乱(系统之间的显着依赖性)。
往往是交叉问题的例子包括:
缓存
数据验证
记录
格式化数据
事务处理
……
以这个场景为例:
您开发了一个具有大量getter 方法的服务,以从数据库中获取数据并将结果格式化为 JSON 字符串。
服务类{ getUser ({id, name}) {
如果 (!Number.isInteger(id))
返回空
const user = DAO.fetch(User, id, name) 返回 JSON.stringify(user)
}
获取文章({id}){
如果 (!Number.isInteger(id))
返回空
const article = DAO.fetch(文章, id)
返回 JSON.stringify(文章)
}
// 获取 Xyz ...}
数据访问对象(DAO) 可以简化为:
const DAO = {
// 数据库访问,在这里查询和检索结果
获取(模型,...参数){
返回新模型(...参数)
}}
这是您的模型:
类文章{
构造函数(id){
这个.id = id
}}类用户{
构造函数(id,名称){
这个.id = id
this.name = 名称
}}
如您所见,Service的任何getter 方法都可以分为 3 个部分(或 3 个关注点):
数据验证:检查id 是否为整数。
主要关注:与数据访问层通信。
格式化数据:将结果转换为 JSON 字符串。
在这个例子中,这 3 个问题被过度简化了。但在实际应用程序中,主要关注点、数据验证和格式数据逻辑可能会变得非常复杂。
数据验证和格式数据逻辑是横切关注点,应该与主要关注点隔离开来,因为它们会分散开发人员对主要业务逻辑的注意力。
因此,我们应该将它们分开并放在三个不同的地方:
服务模块应该只处理主要关注点,或者核心业务逻辑。
数据验证模块应该只负责验证数据。
格式化数据模块应该只负责格式化数据。
使用 Javascript 应用 AOP
有许多库和框架允许我们实现 AOP 解决方案来应对横切关注点。
在这里,我们使用 Javascript 库:方面.js
从主要关注点中删除所有横切关注点,我们重写服务 模块如下:
从 'aspect.js' @Advised ()导入 { Advised }类服务{
getUser({id, name}) {
返回 DAO.fetch(用户,ID,名称)
}
getArticle({id}) {
返回 DAO.fetch(文章,id)
}}
@Advised装饰器 有助于将ValidateAspect 和FormatAspect 连接到服务 类中。Service的实现 非常简洁易读。它只专注于它的主要职责。
最后,我们可以尝试调用一些方法来查看结果:
const service = new Service()控制台。日志(service.getArticle({id: '1'}))// 空控制台。日志(service.getUser({id: 2, name: 'Hello Kitty'}))// {"id":2,"name":"Hello Kitty"}
AOP 的核心概念解释
1/ 看点
方面是具有一组横切功能的模块。
例如:ValidateAspect,FormatAspect
为了形成切面,我们定义了切入点和建议。
2/ 加入点
连接点是应用程序中我们可以插入 AOP切面的特定点。比如方法执行、异常处理、变量修改……很多时候,一个连接点代表一个方法执行。
3/ 建议
建议是在特定连接点采取的行动。换句话说,它是在连接点之前或之后执行的实际代码。
例如:@beforeMethod、@afterMethod、 @aroundMethod
4/ 切入点
切入点是与连接点匹配以确定是否需要运行建议的谓词。根据库或框架,可以使用模式或表达式以不同方式指定切入点。
与图书馆方面.js本文中使用的切入点是用 Javascript 正则表达式 (Regex) 指定的:
{
类名模式:/.*/,
方法名称模式:/^(get)/ }
5/ 目标对象
目标对象是由一个或多个方面建议的对象。也称为建议对象。
例如:示例中使用的服务类。
6/ 编织
编织是将方面与其他对象链接起来以创建建议对象的过程。
例如:使用@Advised装饰器在服务类上应用编织。
关于 AOP 的几点思考
好处
拥抱模块化。
减少依赖之间的耦合。
使代码更易于阅读、重用和维护。
缺点
不包含在编程语言中,必须依赖库才能工作。
调试可能很困难,因为代码流远不止于此。
要求纪律不要过度使用。
面向方面编程在 OOP 世界中被认为是“黑暗艺术”,因为它可以干预您的代码并在幕后执行一些黑魔法。例如,它可以修改您的方法、替换结果,甚至阻止您的代码执行。
尽管它提供了所有的功能,但我们应该小心并深刻理解地使用 AOP。在您的应用程序中不必要地使用 AOP 可能是有害的,并可能导致许多意外错误。
面向方面编程并不是面向对象编程的绝对替代。相反,他们是同伴。
面向方面编程通过提供另一种思考程序结构的方式来补充面向对象编程。OOP 中模块化的关键单元是类,而在 AOP 中模块化的单元是方面。