这个文档是为了描述用于所有Mac OS X代码中的Objective-C(和Objective-C++)编码指南和实践的。这些指南的很多地方已经进化并在其他项目和团队已经过时。谷歌开发的开源项目符合本指南中的要求。
谷歌已经发布了符合这些准则的,作为Mac项目的谷歌工具箱(以下简称GTM)的一部分的开源代码。意味着要在不同项目共享的代码是一个包含在这个库中很好的候选。
注意:这本指南不是一个Objective-C教程。我们假设读者对这么语言很熟悉。如果你是一个Objective-C初学者或需要复习,请阅读的Objective-C编程语言这本书。
他们说一个例子胜过千言万语,让我们开始用一个例子让你感受Objective-C的风格,间距,命名等。
一个头文件的例子,展示了@interface声明的正确注释和间距:
#import <Foundation/Foundation.h> // A sample class demonstrating good Objective-C style. All interfaces, // categories, and protocols (read: all top-level declarations in a header) // MUST be commented. Comments must also be adjacent to the object they're // documenting. // // (no blank line between this comment and the interface) @interface Foo : NSObject { @private NSString *_bar; NSString *_bam; } // Returns an autoreleased instance of Foo. See -initWithBar: for details // about |bar|. + (id)fooWithBar:(NSString *)bar; // Designated initializer. |bar| is a thing that represents a thing that // does a thing. - (id)initWithBar:(NSString *)bar; // Gets and sets |_bar|. - (NSString *)bar; - (void)setBar:(NSString *)bar; // Does some work with |blah| and returns YES if the work was completed // successfully, and NO otherwise. - (BOOL)doWorkWithBlah:(NSString *)blah; @end一个源文件的例子,展示了一个接口的@implementation的正确注释和间距。它也包含一些重要方法,像getters、setters、init和dealloc的参考实现:
#import "Foo.h" @implementation Foo + (id)fooWithBar:(NSString *)bar { return [[[self alloc] initWithBar:bar] autorelease]; } // Must always override super's designated initializer. - (id)init { return [self initWithBar:nil]; } - (id)initWithBar:(NSString *)bar { if ((self = [super init])) { _bar = [bar copy]; _bam = [[NSString alloc] initWithFormat:@"hi %d", 3]; } return self; } - (void)dealloc { [_bar release]; [_bam release]; [super dealloc]; } - (NSString *)bar { return _bar; } - (void)setBar:(NSString *)bar { [_bar autorelease]; _bar = [bar copy]; } - (BOOL)doWorkWithBlah:(NSString *)blah { // ... return NO; } @end在@interface、@implementation和@end前后的空行是可选的。如果你的@interface声明了实参,那么右括号之后需要有一个空行。
除非interface或implementation很短,比如,当定义一小部分私有方法或一个桥接类时,添加空行通常有利于可读性。
命名规则对于代码的可维护性是非常重要的。Objective-C的方法命名趋向于超长命名,但这会带来良好的代码阅读感受,就像读散文一样,同时还避免了很多不必要的注释。
在撰写纯粹的Objective-C代码时,我们主要是遵循标准的Objective-C命名规范。这些命名方针可能和C++的命名规范相去甚远。比如,Google的C++规范中推荐在变量名中的单词间使用下划线,而Objective-C的规范推荐使用驼峰命名法,这也是在Objective-C社区中的标准做法。
任何类、目录、方法或者变量的名字都应该将其中的首字母缩略词设为大写。下面是苹果官方使用的大写的首字母缩略词:URL,TIFF和EXIF。
文件名应该反映其中包含的类实现的名称,按照你项目中的约定且大小写相关。
在一个源码文件中, Objective-C++ 遵循你实现的函数/方法的风格。
类名(类别和协议名称)应为大写,并开始使用大小写混合以区分单词。
分类名称应该以一个2到3个字母的前缀开始,识别分类是项目的一部分,还是打开使用。分类,名称应该结合它扩展的类的名称。
方法名称应该以小写字母开头,混合大小写。每个命名参数也应该以小写字母开头。
变量名以小写字母开头,混合大小写以区分单词。实例变量以下划线开头。例如:myLocalVariable,_myInstanceVariable。
评论删除后,数据将无法恢复
评论(8)
引用来自“红薯”的评论
这篇文章排版比较乱,大家将就看吧,原文如此