引子
在看下面之前,大家自我检测一下自己写的代码是否规范,代码风格是否过于迥异阅读困难?可以相互阅读同伴的代码,是否存在阅读障碍?
若存在晦涩难懂的,理解成本增大的代码,说明你的团队需要自省了。
下面总结一下OC编程中的一些代码规范(苹果官方推荐的)。以OC为示例,但不局限于OC,也可以被当作别的编程语言的开发规范约定(仅需要把OC特有的东西按照你所使用的语言的惯例即可)
参考资料: 对建议的代码规范的说明
命名
命名规则对于维护代码来说是非常重要的,。Objective-C方法名往往很长,不过这也有好处,让很多注释变得毫无意义。
本文推荐驼峰法,也是Objective-C社区的标准。
驼峰法分小驼峰法和大驼峰法。小驼峰法:除第一个单词之外,其他单词首字母大写。大驼峰法相比小驼峰法,大驼峰法把第一个单词的首字母也大写了。
1.基本原则
1.1 清晰
又清晰又简洁是最好的了,但简洁不如清晰重要。总的讲不要使用单词的简写,除了非常常用的简写以外,尽量使用单词全称。API的名称不要有歧义,一看你的API就知道是以什么方式做了什么事情,不要让人有疑问
1.2 一致性
做某个事情代码通常都叫这个名字,比如tag、setStringValue,那么你也这么叫。你在不确定怎么起名字的时候,可以参考一些常用的名字:
2. 类命名
类名(不包括类别和协议名)应该用大写开头的大驼峰命名法。类名中应该包含一个或多个名词来说明这个类(或者类的对象)是做什么的。
在应用级别的代码里,尽量不要使用带前缀的类名。每个类都有相同的前缀不能提高可读性。不过如果是编写多个应用间的共享代码,前缀就是可接受并推荐的做法了(型如 JKPhotoBrowser )。
示例1:
@interface ImageBrowseView :UIView
@end
示例2:(带前缀JK)
@interface JKPhotoBrowser :UIView
@end
3. 类别命名
类名+标识+扩展(UIImageView +HP+Web)
例:如果我们想要创建一个基于UIImageView 的类别用于网络请求图片,我们应该把类别
放到名字是UIImageView+HPWeb.h的文件里。UIImageView为要扩展的类名,HP为专属标
识,Web为扩展的功能。
类别的方法应该都使用一个前缀(型如hp_myCategoryMethodOnAString ),以防止Objective-
space),方法命名规则就没必要恪守了。
类别HPWeb头文件,UIImageView+HPWeb.h如下:
@interface UIImageView (HPWeb)
- (void)hp_setImageWithURLString:(NSString *)urlStr;
@end
4. 方法命名
方法使用小驼峰法命名, 一个规范的方法读起来应该像一句完整的话,读过之后便知函数
的作用。执行性的方法应该以动词开头,小写字母开头,返回性的方法应该以返回的内容
开头,但之前不要加get。
示例:
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;
(instancetype)arrayWithArray:(NSArray *)array;
如果有参数,函数名应该作为第一个参数的提示信息,若有多个参数,在参数前也应该有
提示信息(一般不必加and)
一些经典的操作应该使用约定的动词,如initWith,insert,remove,replace,add等等。
5. 变量命名
变量名使用小驼峰法, 使变量名尽量可以推测其用途属性具有描述性。别一心想着少打几
个字母,让你的代码可以迅速被理解更加重要。
5.1 类成员变量:
成员变量用小驼峰法命名并前缀下划线,Objective-C 2.0,@property 和 @synthesize 提供
了遵守命名规范的解决方法
示例:
@interface ViewController ()
@property (nonatomic,strong)NSMutableArray *dataArray;
@property (nonatomic,strong)UITableView *tableView;
@end
@implementation ViewController
@end
5.2 一般变量命名
示例:
NSMutableArray *ticketsArray = [NSMutableArrayarrayWithCapacity:0];
NSInteger numCompletedConnections =3;
5.3 常量命名
常量(预定义,枚举,局部常量等)使用小写k开头的驼峰法,比如kInvalidHandle ,
kWritePerm
示例:
#define kRunAnnotationStartPointTitle @“起点"
typedef NS_ENUM (NSInteger,RunGoalTypeE){
kRunGoalTypeNone = 0, //无目标
kRunGoalTypeTime = 1, //以时间为目标
kRunGoalTypeDistance = 2, //以距离为目标
kRunGoalTypeCalori = 3, //以消耗卡路里为目标
};
NSString *const kGroupInfoName =@"name";
6. 图片资源文件命名
先看下新浪微博app图片资源命名方式,下面是部分截图: