Save&Load

Save The World, Load The Game

0%

读开源项目 之 AFNetworking(一)

最近恶补了iOS的基础知识之后,发现需要再进一步提高的话有两个比较好的方法:一个是阅读源代码,另一个就是自己多写写代码了。但是不知道写点什么好,所以先看看开源项目,找找灵感顺便学习一下高手们的“招式”。AFNetworking是Git上最著名的iOS开源项目之一,之前也经常看到有人提起,所以正好趁这个机会好好看一看。
准备分几个角度来读这个开源项目,本次先从最容易的代码风格角度来看一看这个鼎鼎有名的AFNetworking。本次阅读的AFNetworking版本为3.0.4。

1.命名

1.1 类名字

AFNetworking files
如图所示,就是AFNetworking整个工程的结构,其实打开工程的时候还是有点意外,心想怎么就这么点文件,大概浏览一遍之后也发现代码行数也不是特别多,看来本人一直对开源项目有误解啊,其实开源项目的内容不是十分复杂,也没有那么复杂的结构,代码也没有那么多。但代码越少不代表能够学习的地方就少了。
闲话少说,我们可以看到类名的命名方式和Apple官方的命名风格是统一的,都是由两个大写字母作为类名的前缀,一般这两个大写字母都是缩写。Apple官方的NS前缀就是[NeXTSTEP]的缩写,这里面就有很多关于乔爷爷的有趣历史故事了。那么AF又是什么的缩写呢?查了一下原来AF是[Alamo Fire]的缩写,这是一种生长在德克萨斯州的花的名字,至于中文名字叫什么就没有查到了。

1.2 方法名

这个好像没什么好说的,现在一般都是采用首字母小写的驼峰命名法。值得注意的就是开头的单词都是动词,而且方法名一般都很短,怎样用几个单词就说明一个方法是一个需要思考的问题。

1.3 变量名

  • 常量 & 枚举

    NSString * const AFNetworkingTaskDidResumeNotification = @”com.alamofire.networking.task.resume”;
    NSString * const AFNetworkingTaskDidCompleteNotification = @”com.alamofire.networking.task.complete”;
    NSString * const AFNetworkingTaskDidSuspendNotification = @”com.alamofire.networking.task.suspend”;
    `
    常量一般都是定义在文件的开头部分,以NSString类型的居多。可以发现AF的常量命名都很长,而且都是以AF开头和类名的命名方式比较像,可能这样也是为了比较好区分常量和一般的变量吧。

  • 方法内变量

    `- (void)addDelegateForDataTask:(NSURLSessionDataTask *)dataTask
                    uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgressBlock
                  downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgressBlock
                 completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
    {
        AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] init];
        delegate.manager = self;
        delegate.completionHandler = completionHandler;
    
        dataTask.taskDescription = self.taskDescriptionForSessionTasks;
    
        [self setDelegate:delegate forTask:dataTask];
        delegate.uploadProgressBlock = uploadProgressBlock;
        delegate.downloadProgressBlock = downloadProgressBlock;
    }
    
    

可以看到,方法内部的变量命名其实还是很简单的,一般就是1-2个描述性单词的组合,格式的话也是采用首字母小写的驼峰命名法。

  • @property变量
    @property变量的命名方式和方法内变量一致,都是1-2个描述性单词的组合。

2. 注释

2.1 版权声明

版权声明

这个部分一般就是看起来很高大上,其实基本没什么人会认真读的部分,不过本人跟喜欢那些好看一点的声明样式,例如下面这样:

佛祖保佑

2.2 接口注释

这一部分不得不膜拜,都听说好的开源项目注释写的都特别好,这次算是见识到了。注释写的真的是好详细都可以导出来做wiki了。接口如何使用,每个参数都是做什么的写的清清楚楚。工作这么长时间,还见过哪个开发有这么认真的写过这样的注释。

2.3 实现内注释

在读AFNetworking的代码的时候就发现,虽然它的类实现最多有1000多行代码,但是单个方法的具体实现很少有代码行数超过10行的。我觉得这是一件很厉害的事情,也是一件很不容易做到的事情。这样带来的一个好处就是代码块很容易就读懂了,所以AFNetworking几乎是没有实现内的注释的,只有一些特殊情况注释说明一下,仅此而已。

3. #pragma mark

#pragma mark这个东东一开始是在书里面看到的,当时就觉得这个挺好用的,如果代码行数多了,用这个标识一下能够方便定位。这个在AFNetworking中也得到了大量的使用。最后附上一个简单的[使用介绍]吧。