产品小王|从面向方面看软件设计

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