虽然说代码风格是个人问题,但是一旦团队项目中充斥着各种各样的个性代码的时候,review就变成了一种痛苦,开发人员也会潜意识的不想去看其他人的代码,鉴于此,整理一个通用的规范还是有必要的,还是那句话,代码是写给人看的。
通用准则
- 除了一些认可的缩写,其他情况都尽量使用全称,下面列出了常用缩写:
alloc、alt(alternate)、app、calc、dealloc、func、horiz(horizontal)、info、init、int、max、min、msg、nib、pboard(pasteboard)、rect、rep(representation)、temp、vert(vertical);还有一些常用技术名词缩写如XML、URL这样的 - 注意保持命名的一致性,最好能够和Cocoa Touch框架的命名保持一致,这个可以参考相关的头文件,作用相同的属性、方法最好能使用相同的命名
- 使用自定义的前缀(类似Foundation框架用的NS)来命名class、protocol、function、constant、typedef structure
- 方法使用驼峰命名法,但以小写字母开头;特别是不要以下划线开头来命名方法,这种方式是保留给Apple专用的(下划线开头命名instance variable除外)
- class的命名应该包含一个能够代表它的名词
- protocol应该根据它所组织起来的行为来命名;如果protocol内组织的方法不和任意class关联的话,那么可以使用ing形式来命名以避免和某个class的名称混淆,如NSLocking这样;如果protocol和某个class比较相关的话,那可以把这个protocol命名成和这个class一样的名字,如NSObject;
- 头文件的命名以该文件内最主要的class、protocol、category来命名
- 每个framework都应该有一个头文件,包含framework的所有public的头文件,然后以framework的名字命名
方法的命名
- 对于对某个对象实施行为的方法,直接以动词+对象的方式命名,如selectTabViewItem这样
- 方法描述两种不同的动作,可以用and连接,其他情况尽量不要用and,如openFile: withApplication: andDeactivate
- 属性存取方法的命名,设置统一使用setXXXX,访问一般为xxx或isXXX;只在需要返回多个值的才使用get开头命名的方法,如getLineDash: count: phase
- delegate方法的命名一般以消息发送方的类名开头(去掉前缀),如tableView: shouldSelectRow;除非只有一个参数,否则发送方的类名后会加一个冒号隔开,比如myView: didOpen对比myViewCloseWindow:;使用did和will表达已经或将要发生的事件,使用should来表达此事件要求接收方进行一些处理
- 方法命中不要用pointer或ptr,而是让参数类型去表达这个信息,下面是一些常用的组合形式:
...action:(SEL)aSelector ...atIndex:(int)index ...title:(NSString *)aString
...target:(id)anObject ...length:(int)numBytes ...intValue:(int)anInt
...frame:(NSRect)frameRect ...point:(NSPoint)aPoint ...tag:(int)anInt
...font:(NSFont *)fontObject ...content:(NSRect)aRect ...alignment:(int)mode
...stringValue:(NSString *)aString ...keyEquivalent:(NSString *)charCode - 类的私有方法的命名,为了避免和父类发生冲突,建议采用前缀加下划线的组合,形如KK_xxxxx这样的方式来命名
函数的命名
- 使用类似class这样的前缀,如NSHighlightRect
- 一般带动词,但如果是返回第一个参数的一个属性,那可以不要这个动词,如float NSHeight(NSRect aRect)
- 如果使用引用的方式返回值,那么使用Get作动词,如const char* NSGetSizeAndAlignment(unsigned int* sizep, unsigned int* alignp)
- 如果返回布尔值,那么应该以受影响者开头,如BOOL NSDecimalIsNotANumber(const NSDecimal* decimal)
数据类型的命名
- 枚举常量、const变量的命名和函数的命名类似
- 一般情况下不要用#define来定义常量,一组相关的整数常量可以使用enum定义,float常量用const定义
- 宏命名全部使用大写,另外双下划线开头的宏是编译器定义的
- 通知的命名方式:[�关联类名]+[Did | Will]+[�唯一名称]+Notification,如NSApplicationDidBecomeActiveNotification
- 异常的命名:[前缀]+[唯一名称]+Exception,如NSFontUnavailableException(注意,常规的,可预期的情况返回错误值;想访问不存在的数组下标这类才用异常)