Mitchell
一、AOP 简介
AOP(Aspect Oriented Programming) 通常译为 面向切面编程
。在工程中常用来分离具体的业务逻辑,个人理解为从不同维度来增加新的业务逻辑,这样在不影响之前功能的前提下可以将新的业务逻辑从某一切面中嵌入工程,达到低耦高聚的目的。
二、在 iOS 工程中的使用
- 传统统计功能(打点): 在工程中产品经理往往都会有统计用户行为的需求,通常第三方服务提供商或多数公司常规的做法是按照标识位(不同事件 ID/eventID)来进行用户行为事件统计,在每一个需要统计的位置插入标记,并记录在文件中,之后按照不同的上传策略将文件上传,后台通过解析事件 ID 来绘制统计数据图。
- 问题:
- 如果按照以上方法来做,代码层面会出现类似以下情景:
- 问题:
/*viewControllerOne*/
@implemention ViewControllerOne()
- (void)viewWillAppear{
[super viewWillAppear];
[MITStat statForEventID:@1 message:@"ViewControllerOne viewWillAppear"];
}
@end
/* viewControllerTwo*/
@implemention ViewControllerTwo()
- (void)viewWillAppear{
[super viewWillAppear];
[MITStat statForEventID:@2 message:@"ViewControllerTwo viewWillAppear"];
}
@end
...
业务代码的分散度高,耦合性强,后期不利于维护,并且需要客户端不断去维护 eventId
的表,并且如果在后台配置的 eventId
一旦改变,必须通过客户端发版来添加或修改新的统计类别。如果线上发现出现遗漏统计点,也需要后面客户端发版来解决。可以见得传统方式的统计效率并不是很理想。
- 面向 AOP 的统计方式
- 既然之前谈过了传统统计方式的一些缺陷,那么使用 AOP 的目的也很明确,就是要弥补传统统计方式的这些缺陷与不足。
- 思路:
- 通过服务器下发统计文件列表的方式来进行统计,客户端通过解析文件中的内容,来判断哪些类中的哪些方法是需要进行统计的,当触发这些方法时,自动将统计事件内容写入统计日志文件,并且依然按照不同的上传策略上传统计日志文件,并在后台生成统计模型图。
- 具体做法:
- 客户端进行 swizz method 来替换需要进行统计事件的方法,在方法内调用自己的统计类的统计方法,并且传入用来区分类和方法的参数,比如 target,class,message 信息等等。
- 服务器下发的文件内容需要和客户端制定协议,协议内容为,客户端解析文件之后可以获得需要统计点的详细信息。比如某个类某个点某个事件,事件 eventID 。将这些信息存入内存中,为了防止由于内容过多导致内存压力过大,可以使用缓存来缓存事件信息。
- 当调用统计类的统计方法时,统计类来将触发的事件写入到文件统计日志中。按照上传策略在需要上传的时候将统计日志上传。
三、总结
- 通过使用 AOP 的统计方式:
- 在代码层面将统计的代码分离出来,降低了耦合提高了聚合性。
- 通过文件的下发的方式,客户端通过对文件的解析,再也不用再去维护本地端的
eventID
表,减少了冗余代码。 - 服务器通过维护一个文件来完成对客户端的统计行为的分析,并且在需要修改统计类信息的时候,也完全可以通过下发文件的方式来更新统计信息,这样无论在漏统计或者需要修改统计点的时候客户端都可以在不发版的情况下就完成,提高了效率。