从面向方面看软件设计( 二 )


三、实现面向方面编程在面向方面编程中 , 关注点是从系统需求中导出的 , 利用分离关注点的概念作为考虑需求和设计系统的基础;这个是进行软件设计的原则 , 下文中展开的软件设计的步骤也是基于此进行描述 。
1. 明确软件需求和大部分的软件设计一样 , 在进行软件设计时要最先明确软件需求 , 也就是明确软件的主要功能是什么;只有抓住了主要功能 , 才能保证我们在软件设计过程中不会偏离方向 。
2. 核心系统设计明确软件需求后 , 我们就可以通过软件需求推导出核心关注点和横切关注点 。
3. 方面识别和设计通过视点识别方面是一种最常用的方法 。 如下图所示 , 每个视点代表一种用户的一组关注点 , 而每组关注点又可以分为核心关注点系统和横切关注点 。
通过视点识别关注点 , 能很好地保证我们在分析时不重复、不遗漏 , 尽可能找到所有的关注点 。
从面向方面看软件设计文章插图
面向方面的设计和编程
面向方面的设计是利用方面进行系统设计的过程 , 通过方面来实现那些在需求工程中所找出来的横切关注点 , 同时将方面与系统的其他组件组合在一起 。
4. 冲突分析和解决在将方面和系统的其他组件结合在一起时 , 要分析并解决可能存在的冲突 , 保证不发生组合的二义性;在不保证二义性的情况下 , 要找到每个方面与系统合适的切入点;只有找到了合适的切入点 , 方面运行才会符合设计者的需求 。
需要特别注意的是 , 由于方面都是基于对系统一定的预期而独立设计的 , 当多个方面一起作用与一个系统 , 一个方面对系统的影响会导致其他方面运行失败 。
5. 名字设计面向设计的最后一步是方面及切入点的名字设计 , 由于面向方面特殊的软件执行顺序 , 所以在设计面向方面程序时要特别注意方面和切入点的名字设计 , 避免方面通过切入点执行程序时调用错误 。
6. 总结面向方面编程的流程图如下:
从面向方面看软件设计文章插图
面向方面的设计过程的流程图
四、测试由于面向方面编程代码的特殊结构 , 测试是具有一定困难的 , 主要的原因是方面的程序与主体代码是紧凑的 , 而不是松散的;就算测试后在一处能正常工作 , 在其他环境下也未必能正常工作 。
下面展开说明可能的测试方法和遇到的困难:
1. 阅读代码测试面向方面编程的代码之间通过切入点进行连接 , 导致代码无法直接阅读;虽然可以借助一些代码阅读工具可以使代码“变平” , 从而降低代码的阅读难度 , 但是面向方面编程的程序语言本身是动态的 , 而非静态的;所以借助工具阅读代码的只是解决了表面问题 , 无法解决实际问题 。
2. 白盒测试与白盒类似的还有结构化测试 , 这两种测试方法的共同点是设计能提供一定程度覆盖的测试方法;比如保证软件的每个执行路径都执行过一遍 , 每个程序语句都执行过一次 。
遇到的问题和阅读代码测试类似 , 由于面向编程软件通过切入点连接 , 导致面向方面的程序不是结构化程序;在某些运行环境下 , 一些方面可能被执行 , 一些方面不执行;而在另一种运行环境下 , 方面的执行情况又是另一种情况 , 方面之间又相互影响;所以产生了庞大的测试地图 , 大大增加了测试难度 。
很多现实世界中的系统都会涉及敏感操作 , 为了减少敏感操作带来的损失 , 系统需要在敏感操作之前验证用户身份 , 并进行相关的记录操作 , 比如生成日志、发出通知等 。
那么这种功能的实现逻辑是什么呢?这篇文章将以财务系统的数据查看功能为例子说明面向方面编程如何实现用户认证 。
财务系统中有很多敏感数据及敏感操作权限 , 这些数据及操作只能被有相关权限的员工看到及使用 。
但是在很多情况下 , 仅仅靠权限控制无法达到理想效果 , 比如财务人员打开了相关页面并短暂离开座位去完成其他工作 , 这个时候该页面上的数据和操作没有任何保护措施 。
为了对敏感数据及操作有更好的保护效果 , 产品往往会在相关领域增加账号验证——要查看敏感数据或者进行敏感操作需要先验证账号密码;如果密码不匹配 , 将直接退出系统并记录相关操作信息;如果账号密码正确 , 则继续操作并记录相关操作信息 。
这种功能的实现逻辑大概有以下两种: