从面向方面看软件设计

编辑导语:面向方面编程也就是AOP , 它使开发人员可以更好地将本不该彼此纠缠在一起的任务(例如数学运算和异常处理)分离开来;本文作者从面向方面看软件设计 , 我们一起来了解一下 。
从面向方面看软件设计文章插图
产品小王今天接到了一个新的需求——客户希望把登录验证时间从12小时调整到24小时 。
产品小王接到需求时 , 心想这不就是把服务器中的数字从12改成24吗?简单得很 , 所以为了展现自己的专业性 , 他一口答应市场部的同事说今天就可以实现你这个需求;心里还想着用一点小手段就让市场部同事欠自己一个人情 , 以后找市场部办事方便多了 。
于是产品小王便找到研发老王说:能不能帮忙把登录验证时间改成24小时啊 , 我已经答应市场部了今天实现 , 没问题吧 。
研发老王一听就说这个做不了 , 你赶紧和研发部同事说下 , 别耽误人家事了 。
小王一听 , 急了 , 急忙问到为什么啊 , 不就是改个数字吗?
老王说 , 可不仅仅是改个数字 , 我们当时在实现系统的时候 , 为了快速实现安全的相关功能 , 所以安全模块是贯穿很多模块的;如果要改这个数字 , 首先要看在各个模块中关于安全模块的相关代码 , 然后再查看修改代码产生的影响 , 最后还要测试数字修改后代码是否能正常运行 。
小王心想:为什么改个数字要这么复杂啊?
其实这个问题在软件工程中很早就出现了 , 软件工程中也早就有一个很好的解决办法——面向方面编程(AOSE:Aspect-Oriented Software Engineering) , 这篇文章就详细展开说明什么是面向方面编程 。
一、面向及面向方面一般情况下 , 在软件实现过程中 , 单个需求需要多个组件实现 , 而每个组件也可能同时服务于多个需求 。
换句话说就是一个组件可以服务多个需求 , 一个组件中也包含实现多个系统需求的代码;正如在下面这张图片中 , 安全需求组件和恢复需求组件同时服务于客户需求 , 账户需求和管理需求 , 组件之间相互搭配 , 进而实现系统功能的 。
从面向方面看软件设计文章插图
软件系统结构
在图中可以看到 , 在这个简单的系统中有三个核心功能组件 , 分别是客户需求 , 账户需求和管理需求;同时为了保持这三个核心功能组件能稳定运行 , 增加了安全需求和恢复需求组件 。
在面向方面编程中 , 核心关注点(Concerns)指系统要实现的主要功能 , 比如上述图片中的客户需求、账户需求、管理需求;而把服务于核心关注点实现的功能称为横切关注点(CrossCutting Concerns) , 比如上述图片中的中的安全需求和恢复需求 。
传统的代码实现过程中 , 核心关注点的实现总是包含额外的代码来实现横切关注点 , 这就会导致代码混乱和分散;虽然这种程序的实现方式能够提高效率 , 但是这种结构会导致的横切关注点的组件修改成本 , 复用成本都非常高 。
原因是需要找出横切关注点与核心关注点组件间如何相互配合 , 并评估修改后对核心关注点组件的影响 , 修改完成后 , 还要全部验证核心关注点的组件 。
说到这里 , 已经说明清楚面向方面编程的起因 , 接下来将说明什么是方面以及什么是面向方面编程 。
方面指的就实现一个功能的程序 , 与其他程序不同的是 , 方面更偏向于描述程序间组成方法——一个可执行的方面根据自身的描述去组合对象 , 方法和其他方面创建处理的 , 同时规定了程序在什么地方运行 。
方面的主要内容包括切入点、程序和连接点:切入点说明约定方面在什么时间开始执行程序;连接点指定系统在执行完程序后继续执行的程序 , 包括进行方法调用、初始化变量或者更新域 , 定义引用的事件集合等 , 如下图所示 。
从面向方面看软件设计文章插图
面向方面编程实例
面向方面编程正是基于方面的概念而诞生的 , 是一种专门实现横向关注点组件的编程思想 。
二、分离关注点面向方面编程的核心内容是分离关注点 , 是思考和构建软件系统的重要方法 。
在面向方面编程中将关注点划分为各自独立的关注点 , 要求程序中的每个方面(类、方法、过程等)只为实现一个目的 , 进而降低修改和复用方面的成本 , 甚至不用思考关注点之间的相互影响 。
当用关注点来表示一个需求或者一组需求的时候 , 我们可以很容易在实现组件中跟踪需求;如果需求发生改变 , 研发人员可以快速定位到需要需改的代码 , 并且不需要考虑方面之间的相互影响 , 快速实现需求改变 。