前言
细心的人会发现,在很多程序员招聘要求上会有代码规范这一要求,刚开始可能认为这个要求很容易达到,但其实细想,这并不是一个简单地要求。
一开始,我仅仅只以能实现功能为主要目的,其他细节一概不管,但是注意到招聘要求的细节后仔细想过,在公司,自己的代码要给很多人看,所以做到代码清晰简洁、方便阅读理解很重要。
bjective-C代码规范整理几点,如下:
一、编码规范
1、命名规范
类命名
首字母大写,之后每个单词首字母都大写
使用能够反映类功能的名词短语
文件和类同名
举例:BaseClient、ImageStore
特殊类命名
如果是视图控制器的子类应添加后缀“ViewController”或者“Controller”
如果是视图的子类应添加后缀“View”
如果是按钮的子类应添加后缀“Button”
等等。。。
举例:SettingsViewController、NavigationView
分类(类别)命名
与类命名相同,此外需添加要扩展的类名和“+”
举例:NSString+URLEncoding
协议(委托)命名
与类命名相同,此外需添加“Delegate”后缀
举例:ReplyViewDelegate
枚举类型命名
首字母大写,之后每个单词首字母都大写,最后加“s”
枚举变量使用枚举类型去掉“s”作为前缀,每个单词首字母大写,中间不允许加下划线
举例:
1 | typedef enum UIControlEvents{ |
方法命名
首字母小写,之后每个单词首字母都大写
方法名使用动词短语
举例:- (void)setPostValue:(int)value
方法参数命名
首字母小写,之后每个单词首字母都大写
具有足够的说明性
不需要添加类型前缀
举例:- (void)sendUserInfo:(NSDictionary *)userInfo
变量命名
首字母小写,之后每个单词首字母都大写
具有足够的说明性
成员变量添加“_”前缀
常量命名
常量(预定义,局部常量等)使用小写k开头的驼峰法
举例:kInvalidHandle , kWritePerm
对于系统的常用类作实例变量声明时加入后缀:
UIViewController:VC
UIImage:Img UIImageView:ImgView UIView:View
UILabel:Lbl UIButton:BtnUINavigationBar:NBar UIToolBar:TBar
UISearchBar:SBar
UITextField:TextField UITextView:TextView
NSArray:Array NSMutableArray:MArray
NSDictionary:Dict NSMutableDictionary:MDict
NSString:Str NSMutableString:MStr
NSSet:Set NSMutableSet:MSet
2、空行
.h中的空行
文件说明与头文件包涵(#import)之间空1行
头文件包涵(#import)之间,如果需要分类区别,各类别之间空1行
头文件包涵(#import)与@class之间空2行
@interface与@class之间空一行
头文件{}里面,空1行开始声明对象成员,如果需要分类区别,各类别之间空1行
{}外空1行,书写属性,如果需要分类区别,各类别之间空1行
空1行开始写方法,如果需要分类区别,各类别之间空1行
方法完成后,空1行@end
如果需要声明protocal,空2行接着写。通常protocal写在@end后面,但是声明在@interface前面,也可以另写一个文件
.m中的空行
文件说明与头文件包涵(#import)之间空1行
头文件包涵(#import)之间,如果需要分类区别,各类别之间空1行
@implementation和@synthesize之间空一行,@synthesize不要使用逗号(,)如果需要分类区别,各类别之间空1行
@synthesize与方法之间空2行
各方法之间空2行
方法里面的空行
方法名后空1行开始写
变量声明后需要空1行,如果需要分类区别,各类别之间空1行
条件,循环,选择语句,整个语句结束,需要空1行
各功能块之间空1行
最后一个反括号之前不空行
注释与代码之间不空行
#pragma mark
与方法之间空1行
3、空格
.h中协议<>前面有1个空格
.h中成员声明时,类型与变量之间有至少1各空格。星号(*)靠近变量,不靠近类型。(部分习惯,所有变量可以以*对齐,中间留空)
@property后有1各空格,()里面,逗号后有1个空格,括号外,先留1个空格,再声明属性
方法+,-后,与()之间有1个空格
返回类型与*之间有1个空格,方法参数中返回类型与*之间有1个空格
多参数的方法,每一个参数后面都有1个空格
4、注释
文件都包含文件头,要说明文件名、作者、创建时间、变更记录
多人协作完成项目时,public接口的每个方法都应该添加关于函数,参数,返回值以及副作用的注释
1 | /** |
当if语句的判断条件复杂时,需要用注释说明判断内容
接口类(继承于BaseClient)的头文件每个方法前都应该注明方法的作用
5、方法
*. 留一个空格在-或+和返回类型之间,但参数列表里的参数之间不要留间隔,每个冒号之前都必须有对该参数的说明词,如:
1 | - (void)doSomethingWithString:(NSString *)string number:(int)num |
*. 如果参数过多,推荐每个参数各占一行。使用多行的情况下,在参数前加冒号用于对齐,如:
1 | - (void)doSomethingWith:(GTMFoo *)theFoo |
6、其他
NSLog和不要的代码在测试完成后一律删除,及时删除或注释掉无用的代码
为了不影响阅读,一个类的代码行数尽量不要超过300行;一个方法尽量不要超过30行。有超过的在重构的时候想办法分解。
操作符前后都要加空格
UITableViewCell里面的network client都要委托出来
控件布局使用相对坐标
二、文档结构管理
建立Libraries文件夹,所有第三方库放入其中。
建立Utilities文件夹,自已封装的类放入其中。
建立Constants.h头文件,所有的常量定义于其中。Constants.h文件放入Main文件组里面。
视图控制器及AppDelegate统一放在“Controllers”分组下
每个功能块放入一个Group,在目录里建立实际文件夹管理。
程序资源文件放入Supporting Files文件夹中。如.plist、数据库资料等。
在Supporting Files文件夹下建立Image、Music和Video等相关文件夹。图片、音频、视频等资源分别放入其中。图片资源以程序逻辑框架建立相应实体文件夹管理,若多个功能块共用的,建立Common文件夹,放入其中。
后话
其实,学会这些规则很简单,关键是一直坚持遵守,然后成为一种习惯,如果能有这种认知,视代码为颜值,那不用督促,代码都会写的无比漂亮,祝越来越美!