视代码为颜值:Objective-C代码规范

前言

细心的人会发现,在很多程序员招聘要求上会有代码规范这一要求,刚开始可能认为这个要求很容易达到,但其实细想,这并不是一个简单地要求。

一开始,我仅仅只以能实现功能为主要目的,其他细节一概不管,但是注意到招聘要求的细节后仔细想过,在公司,自己的代码要给很多人看,所以做到代码清晰简洁、方便阅读理解很重要。

bjective-C代码规范整理几点,如下:

一、编码规范

1、命名规范

类命名

  1. 首字母大写,之后每个单词首字母都大写

  2. 使用能够反映类功能的名词短语

  3. 文件和类同名

  4. 举例:BaseClient、ImageStore

特殊类命名

  1. 如果是视图控制器的子类应添加后缀“ViewController”或者“Controller”

  2. 如果是视图的子类应添加后缀“View”

  3. 如果是按钮的子类应添加后缀“Button”

    等等。。。

  4. 举例:SettingsViewController、NavigationView

分类(类别)命名

  1. 与类命名相同,此外需添加要扩展的类名和“+”

  2. 举例:NSString+URLEncoding

协议(委托)命名

  1. 与类命名相同,此外需添加“Delegate”后缀

  2. 举例:ReplyViewDelegate

枚举类型命名

  1. 首字母大写,之后每个单词首字母都大写,最后加“s”

  2. 枚举变量使用枚举类型去掉“s”作为前缀,每个单词首字母大写,中间不允许加下划线

  3. 举例:

1
2
3
4
5
6
7
typedef enum UIControlEvents{

UIControlEventTouchDown,

UIControlEventTouchUpInside

}UIControlEvents;

方法命名

  1. 首字母小写,之后每个单词首字母都大写

  2. 方法名使用动词短语

  3. 举例:- (void)setPostValue:(int)value

方法参数命名

  1. 首字母小写,之后每个单词首字母都大写

  2. 具有足够的说明性

  3. 不需要添加类型前缀

  4. 举例:- (void)sendUserInfo:(NSDictionary *)userInfo

变量命名

  1. 首字母小写,之后每个单词首字母都大写

  2. 具有足够的说明性

  3. 成员变量添加“_”前缀

常量命名

  1. 常量(预定义,局部常量等)使用小写k开头的驼峰法

  2. 举例:kInvalidHandle , kWritePerm

对于系统的常用类作实例变量声明时加入后缀:

  1. UIViewController:VC

  2. UIImage:Img  UIImageView:ImgView  UIView:View
      
    UILabel:Lbl UIButton:Btn

  3. UINavigationBar:NBar   UIToolBar:TBar  

UISearchBar:SBar

  1. UITextField:TextField  UITextView:TextView

  2. NSArray:Array   NSMutableArray:MArray

  3. NSDictionary:Dict  NSMutableDictionary:MDict

  4. NSString:Str   NSMutableString:MStr

  5. NSSet:Set      NSMutableSet:MSet

2、空行

.h中的空行

  1. 文件说明与头文件包涵(#import)之间空1行

  2. 头文件包涵(#import)之间,如果需要分类区别,各类别之间空1行

  3. 头文件包涵(#import)与@class之间空2行

  4. @interface与@class之间空一行

  5. 头文件{}里面,空1行开始声明对象成员,如果需要分类区别,各类别之间空1行

  6. {}外空1行,书写属性,如果需要分类区别,各类别之间空1行

  7. 空1行开始写方法,如果需要分类区别,各类别之间空1行

  8. 方法完成后,空1行@end

  9. 如果需要声明protocal,空2行接着写。通常protocal写在@end后面,但是声明在@interface前面,也可以另写一个文件

.m中的空行

  1. 文件说明与头文件包涵(#import)之间空1行

  2. 头文件包涵(#import)之间,如果需要分类区别,各类别之间空1行

  3. @implementation和@synthesize之间空一行,@synthesize不要使用逗号(,)如果需要分类区别,各类别之间空1行

  4. @synthesize与方法之间空2行

  5. 各方法之间空2行

方法里面的空行

  1. 方法名后空1行开始写

  2. 变量声明后需要空1行,如果需要分类区别,各类别之间空1行

  3. 条件,循环,选择语句,整个语句结束,需要空1行

  4. 各功能块之间空1行

  5. 最后一个反括号之前不空行

  6. 注释与代码之间不空行

  7. #pragma mark与方法之间空1行

3、空格

  1. .h中协议<>前面有1个空格

  2. .h中成员声明时,类型与变量之间有至少1各空格。星号(*)靠近变量,不靠近类型。(部分习惯,所有变量可以以*对齐,中间留空)

  3. @property后有1各空格,()里面,逗号后有1个空格,括号外,先留1个空格,再声明属性

  4. 方法+,-后,与()之间有1个空格

  5. 返回类型与*之间有1个空格,方法参数中返回类型与*之间有1个空格

  6. 多参数的方法,每一个参数后面都有1个空格

4、注释

  1. 文件都包含文件头,要说明文件名、作者、创建时间、变更记录

  2. 多人协作完成项目时,public接口的每个方法都应该添加关于函数,参数,返回值以及副作用的注释

1
2
3
4
5
6
7
8
9
10
11
/**

* 方法或变量说明

* @param 参数1说明(针对方法)

* @param 参数2说明(针对方法)

* @return 若方法有返回值则对返回值作说明

*/
  1. 当if语句的判断条件复杂时,需要用注释说明判断内容

  2. 接口类(继承于BaseClient)的头文件每个方法前都应该注明方法的作用

5、方法

*. 留一个空格在-或+和返回类型之间,但参数列表里的参数之间不要留间隔,每个冒号之前都必须有对该参数的说明词,如:

1
- (void)doSomethingWithString:(NSString *)string number:(int)num

*. 如果参数过多,推荐每个参数各占一行。使用多行的情况下,在参数前加冒号用于对齐,如:

1
2
3
- (void)doSomethingWith:(GTMFoo *)theFoo
rect:(NSRect)theRect
interval:(float)theInterval

6、其他

  1. NSLog和不要的代码在测试完成后一律删除,及时删除或注释掉无用的代码

  2. 为了不影响阅读,一个类的代码行数尽量不要超过300行;一个方法尽量不要超过30行。有超过的在重构的时候想办法分解。

  3. 操作符前后都要加空格

  4. UITableViewCell里面的network client都要委托出来

  5. 控件布局使用相对坐标

二、文档结构管理

  1. 建立Libraries文件夹,所有第三方库放入其中。

  2. 建立Utilities文件夹,自已封装的类放入其中。

  3. 建立Constants.h头文件,所有的常量定义于其中。Constants.h文件放入Main文件组里面。

  4. 视图控制器及AppDelegate统一放在“Controllers”分组下

  5. 每个功能块放入一个Group,在目录里建立实际文件夹管理。

  6. 程序资源文件放入Supporting Files文件夹中。如.plist、数据库资料等。

  7. 在Supporting Files文件夹下建立Image、Music和Video等相关文件夹。图片、音频、视频等资源分别放入其中。图片资源以程序逻辑框架建立相应实体文件夹管理,若多个功能块共用的,建立Common文件夹,放入其中。

后话

其实,学会这些规则很简单,关键是一直坚持遵守,然后成为一种习惯,如果能有这种认知,视代码为颜值,那不用督促,代码都会写的无比漂亮,祝越来越美!

参考

iOS代码规范

iPhone开发:Objective C 代码规范-iOS总结版

iOS编程规范