软考高级《系统架构设计师》-- 面向切面的编程(AOP) 复习 笔记

1,537 阅读6分钟

前言

今天是2022年8月23日 距离软考高级《系统架构设计师》考试还有 75 天。

根据网上一些帖子的介绍。软考每年通过率大概在15%不到。三门成绩还必须同时及格,才算通过。考试每年设置一次。

那么,如果3门考试,我今年只过2门,明年再考一门行吗?

答案是不行的。3门课必须同时通过,才通过当年考试。

目前比较担心的是案例分析 和 论文写作两个考试,因为如果肚子里没货,你一个字都写不出来。但是选择题你多多少少可以连蒙带猜。

还是先复习吧。抓紧时间。

AOP 产生的背景

面向过程的编程面临的问题

面向过程编程是一种自顶向下的编程方法,其实质是对软件进行功能性分解。它适 用于小型软件系统,例如某一算法的实现。 在大型应用系统中,自顶向下逐步求精的方 法无论在系统体系结构的确立,系统的进化和维护,以及软件重用性方面都存在其不足 之处。

传统面向对象编程面临的问题

传统的面向对象语言由于其良好的封装性、层次化性以及继承性等特性而取得了很 大的成功,并且对象模型可以很好地映射到实际领域。但是,在软件的生命周期中,它 存在以下不足之处。

(1)设计阶段,由于以类为单位组织建模,因此它不能全面地反映软件系统的需求。

(2)编码阶段,将数据和方法封装到类中的思想增强了数据的安全性和软件的模块 化,但是有一一些数据和方 法是特定于应用的,因此这种编码阶段的封装减少了代码重用 的可能性。

(3)维护阶段,由于类中夹杂了各种特定于应用的代码,使得维护人员难以理解代 码。此外,完成某个特定需求的代码分散在各个类中,当这些代码需要改变时,很难把 它们全部找到,这就给程序的健壮性带来了隐患。 由于上述这些问题的产生,需要一-种新的程序设计方法从 更高的层次上对软件系统 进行抽象,将传统的按功能或按对象划分程序模块的方法转化为按系统特征划分程序模 块,这就是AOP的基本思想。

AOP

基本概念

AOP可以说是OOP (Object-Oriented Programming,面向对象编程)的补充和完善。

OOP引入封装、继承和多态性等概念来建立-种对象层次结构,用以模拟公共行为的一 个集合。当需要为分散的对象引入公共行为时,OOP则显得无能为力。也就是说,OOP 允许定义从上到下的关系,但并不适合定义从左到右的关系。

例如日志功能,日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能亳无关系。

对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。

这种散布在各处的无关的代码被称为横切(cross cutting)代码,在00P设计中,它导致了大量代码的重复, 而不利于各个模块的重用。

而AOP技术则恰恰相反,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到-个可重用模块,并将其命名为Aspect,即方面。所谓“方面”“切片”,简单地说,就是将那些与业务无关,却被业务模块所共同调用的逻辑或责任封装起来,以减少系统的重复代码,降低模块间的耦合度,并有利于未来的 可操作性和可维护性。

使用“横切”技术,AOP把软件系统分为两个部分:

  • 核心关注点
  • 横切关注点。

业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。

横切关注点的一个特点是,它们经常发生在核心关注点的多处,而各处都基本相似,例如权限认证、日 志、事务处理。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点 分离开来。正如Avanade公司的高级方案构架师Adam Magee所说,AOP的核心思想就 是“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。”

实现AOP的技术,主要分为两大类:

  • 一是采用动态代理技术, 利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;
  • 二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。

实现AOP的技术特性

join point (连接点):

是程序执行中的一个精确执行点,例如类中的一个方法。 它是一个抽象的概念,在实现AOP时,并不需要去定义一个join pointo

point cut (切入点):

本质上是一个捕获连接点的结构。在AOP中,可以定义一个point cut,来捕获相关方法的调用。

advice (通知):

是point cut的执行代码,是执行“方面”的具体逻辑。

aspect (方面):

point cut和advice结合起来就是aspect,它类似于OOP中定义的一个类,但它代表的更多的是对象间横向的关系。

introduce (引入):

为对象引入附加的方法或属性,从而达到修改对象结构的目的。有的AOP工具又将其称为mixing。

上述的技术特性组成了基本的AOP技术,大多数AOP工具均实现了这些技术。它们也可以是研究AOP技术的基本术语。

AOP 的特性

  • 可扩展性
  • 可重用性
  • 易理解性
  • 易维护性

AOP程序设计步骤

(1)将系统需求进行功能性分解,区分出普通的关注点与横切关注点,确定哪些功能是组件必须实现的,哪些可以以aspect的形式动态的加入到组件中。 (2)单独完成每一个关注点和编码实现。 (3)用联结器制定的重组规则,将组建代码与aspect代码进行组合,形成最终的系统。

两种成熟的商业AOP技术

  • AspectJ
  • Spring AOP