现代软件开发是一个团队合作,多人协同的过程。良好的命名规范加上合理充分的注释可以使代码审查与修改过程少浪费时间,也可以使后期的代码维护变的高效快捷。
建议在团队开发的过程中尽量使用统一的命名规范。
在谈到命名规范之前我们先来看一下常用的英文标识符命名法和英文缩写规则。
标识符命名法
- 驼峰(Camel)命名法:又称小驼峰命名法,除首单词外,其余所有单词的第一个字母大写。
- 帕斯卡(Pascal)命名法:又称大驼峰命名法,所有单词的第一个字母大写。
- 下划线命名法:单词与单词之间用下划线做间隔。
- 匈牙利命名法:广泛应用于微软编程环境中,在以Pascal命名法的变量前附加小写序列说明该变量的类型。量的取名方式为:
{scope_}+{prefix_}+{qualifier}
尽可能的用最少的字符而又能完整的表达标识符的含义。
英文缩写规则
- 较短的单词可通过去掉“元音”形成缩写
- 较长的单词可以取单词的头几个字母形成缩写
- 此外还有一些约定成俗的英文单词缩写,专业术语缩写等
命名规范
- 命名空间
苹果提供给用户使用的API是按照模块来划分组织成Framework或者dylib的形式。观察其中类,方法,变量,枚举,结构的命名无一不加上了命名前缀。
代码开发中经常会出现当我们引用第三方的类库或者我们制作类库提供给第三方使用。这时候就难免会出现命名冲突的问题。
C++中可以通过 using namespace (命名空间)来解决冲突,Java中有package(包)。Objective-C中一般的处理方法就是加命名前缀。
这个命名前缀可以是公司名称的缩写,也可以是模块功能的缩写。比如GTMBase64,AFNetworking,等。
对于自定义的一些全局性的变量和宏建议都加上前缀。
类型(类、枚举、结构)命名前要加相关模块前缀。
UIView
NSString
CGRect
枚举类型命名要加相关类名前缀,并且枚举值命名要加枚举类型前缀。
typedef NS_ENUM(NSInteger,UIPreviewActionStyle) {
UIPreviewActionStyleDefault=0,
UIPreviewActionStyleSelected,
UIPreviewActionStyleDestructive,
} NS_ENUM_AVAILABLE_IOS(9_0);
函数命名要加上相关类型名前缀。例如CoreGraphics框架中的
CGRect CGRectMake ( CGFloat x, CGFloat y, CGFloat width, CGFloat height );
CGPoint CGPointMake ( CGFloat x, CGFloat y );
- 类与对象
类名使用完整的英文单词或者汉语拼音,使用大驼峰命名法。
如UIApplication,UIWindow,UIViewController等。
给一个带修饰的某类型的对象命名的时候采用 修饰+类型的方式,而不是先制定类型。将类型放在功能前面是不符合Objective-C规范的。
titleLabel;//这是一个标签对象 UILabel*
labelTitle;//标签对象的标题? NSString对象?
cancelButton;//取消按钮
buttonCancel;//按钮点击的动作事件?
- 方法与参数
使用过程化的方式命名方法。询问是否允许发生使用should并返回布尔变量,即将发生使用will,已经发生使用did,判断是否发生使用is并返回布尔变量等。比如UIViewController中的方法:
-(BOOL)shouldAutorotate;
-(void)viewWillAppear:(BOOL)animated;
-(void)viewDidAppear:(BOOL)animated;
-(BOOL)isViewLoaded;
方法命名时,每个参数前要加参数的名称提示,名称提示后可以跟该参数的类型或者是否可以为空等信息。
-(instancetype)initWithNibName:(NSString *)nibName
bundle:(NSBundle *)nibBundle;
-(instancetype)initWithCoder:(NSCoder *)decoder;
- 变量
对于类与对象中定义的变量和属性尽量使用完整的英文单词或者汉语拼音,使用小驼峰命名法。
@property (strong, nonatomic) UIView *captureImageOptionView;
@property (weak, nonatomic) UILabel *attentionLabel;
对于方法或者函数中出现的临时变量可以使用缩略单词。
NSString *tmpStr = nil;
全局变量和宏尽量使用完整的英文单词或者汉语拼音,并且使用全大写英文字母或者大驼峰命名发。
#define NS_BLOCKS_AVAILABLE 1
#define NSIntegerMax LONG_MAX
NSString *const ABMExternalAddressBookChangeNotification
= @"ABMExternalAddressBookChangeNotification";
- 代理回调
回调时被调用者要知道其调用者,可以将调用者对象作为回调方法中的第一个参数:
-(void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
-(void)onClick:(UIButton *)sender