项目中AOP的使用

AOP

Aspect Oriented Programming 面向切面(切片)编程的缩写。

什么是AOP

在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。这句话清晰简洁的给AOP做了定义。

1
2
3
4
5
面向方面编程(AOP)是施乐公司帕洛阿尔托研究中心(Xerox PARC)在上世纪90年代发明的一种编程范式,但真正的发展却兴起于近几年对软件设计方兴未艾的研究。

由于软件系统越来越复杂,大型的企业级应用越来越需要人们将核心业务与公共业务分离。AOP技术正是通过编写横切关注点的代码,即“方面”,分离出通用的服务以形成统一的功能架构。它能够将应用程序中的商业逻辑同对其提供支持的通用服务进行分离,使得开发人员从重复解决通用服务的劳动中解脱出来,而仅专注于企业的核心商业逻辑。

因此,AOP技术也就受到越来越多的关注,而应用于各种平台下的AOP技术也应运而生。但由于AOP技术相对于成熟的OOP技术而言,在性能、稳定性、适用性等方面还有待完善,同时AOP技术也没有形成一个统一的标准,这使得AOP技术的研究更具有前沿性的探索价值。

能做什么

AOP能将事务处理、日志管理、权限控制、异常处理等封装起来,以便于减少系统的重复代码,降低模块间的耦合,使业务代码更纯粹易读,且有利于未来的可操作性和可维护性。

处理繁琐的菜单&操作权限

在XXX管理系统中,菜单权限是必不可少的。并且随着企业管理的精细化,菜单的各种操作权限判断也是越来越多,所以简洁统一的处理方式是很有必要的。

在我们的项目中,每一个菜单权限都可能涉及到操作权限,它们包括:查看、新增、编辑、删除、审批、分配、重置、轨迹、下载、转移、退回、转为客户等11个。随着产品功能的不断完善,操作权限也将会越来越多。如果我们在每个ViewController的ViewDidLoad方法中去判断控制的话,工作量会非常的大。而且如果以后操作权限有变动的话,我们还得每个ViewController都去修改,很容易漏改。那么有简单的处理方式吗?

当然利用AOP思想和Objective-C runtime的特性,我们可以像下面这样处理:

  1. 利用分类或继承,为每个ViewController都添加权限相关的属性。
  2. 利用runtime的特性,植入权限验证代码(通常替换ViewDidLoad方法)。
  3. 创建权限相关的控件时提供固定的Tag值(比如EditButton的Tag值为1000,NewButton的Tag值为2000)。
  4. 在新的ViewDidLoad方法中利用第一步中的权限属性,对权限相关控件(利用Tag来获取相关控件)进行统一操作,这样就实现了在所有ViewController中统一判断权限。
1
2
3
还有另一种不替换ViewDidLoad的方法。

即利用分类,在ViewController的分类中新添加一个类方法,比如叫VerifyPermission。在该方法中判断相关权限。这样只需要在所有ViewDidLoad中手动调用一次VerifyPermission即可。
avatar

Code4Cocoa

A ThoughWorker