Apple 制定了一套关于如何编写代码以实现最大清晰度和与框架集成的指南。此外,还有一些 Cocoa 开发人员经常使用的未记录的约定。
类名:
类名总是大写的。
Objective-C 没有命名空间,因此请在类名前加上首字母。这避免了“命名空间冲突”,即两段代码具有相同名称但执行不同操作的情况。 Cocoa Dev Central 创建的类可能会以“CDC”为前缀。
如果您是标准 Cocoa 类的子类,最好将您的前缀与超类名称结合起来,例如 CDCTableView。
变量名称:
-
变量名称以小写字母开头,但在出现新单词的地方都内部大写:
NSString * streetAddress = @"1 Infinite Loop";
NSString * cityName = @"Cupertino";
NSString * countyName = @"Santa Clara";
--------- 正确的方式 ---------
NSString * hostName;
NSNumber * ipAddress;
NSArray * accounts;
--------- 错误的方式 ---------
NSString * HST_NM; // all caps and too terse
NSNumber * theip; // a word or abbreviation?
NSMutableArray * nsma; // completely ambiguous
变量不能以数字、空格、下划线以外的特殊字符开头。
-
Apple 不鼓励使用下划线作为私有实例变量的前缀。
NSString * name // correct!
NSString * _name // _incorrect_
变量名称:指示类型
- 在实际实践中,如果变量名是常见的 NSString、NSArray、NSNumber 或 BOOL,则通常不表示类型。
正确
NSString * accountName;
NSMutableArray * mailboxes;
NSArray * defaultHeaders;
BOOL userInputWasUpdated;
可以,但不理想
NSString * accountNameString;
NSMutableArray * mailboxArray;
NSArray * defaultHeadersArray;
BOOL userInputWasUpdatedBOOL;
- 如果变量不是这些类型之一,则名称应反映它。此外,有些类您只需要一个实例。在这种情况下,只需根据类名命名变量。字体管理器就是一个很好的例子。
何时指示类型
NSImage * previewPaneImage; // self-explanatory
NSProgressIndicator * uploadIndicator; // shows progress for uploads
NSFontManager * fontManager; // only one of these, basic name ok
方法名称
方法也许是我们可以谈论的最重要的话题。大多数面向对象的语言都使用语法。
虽然这些方法名称在第一次编写时很容易,但实际行为并不清楚。在大量的周围代码中,这更是一个问题。
Cocoa 程序员从头思考,根据实际使用中的外观选择方法名称。假设我想写一个内存中的文件对象写入磁盘。
在 Cocoa/Objective-C 中,它看起来像这样:
[fileWrapper writeToFile: path atomically: YES updateFilenames: YES];
方法名称:访问器
- 与许多其他语言相比,Objective-C 不鼓励在简单访问器上使用“get”前缀。实例变量和方法可以具有相同的名称,因此请使用此名称:
正确!
- (NSString *) name;
- (NSString *) color;
name = [object name];
color = [object color];
不正确
- (NSString *) getName;
- (NSColor *) getColor;
name = [object getName];
color = [object getColor];
- 但是,“get”前缀用于通过内存地址间接返回值的情况:
何时使用“获取”前缀
// 将对象从 NSArray 复制到缓冲区中
id *buffer = (id *) malloc(sizeof(id) * [array count]);
[array getObjects: buffer];
( Don't worry if you don't know what malloc does. )
The "set" prefix is always used on setters, though:
[object setName: name];
[object setColor: color];
形容词
并非所有访问器都返回名称、日期、身高等值。有些代表对象的特殊品质。这些通常由 BOOL 表示。
-
例如,“可选”。在 Objective-C 中,该键的 getter 称为 -isSelectable,但 setter 是 -setSelectable:
BOOL selectable = [textView isSelectable];
BOOL editable = [textView isEditable];
[textView setSelectable: YES]; // no "is"
[textView setEditable: YES]; // no "is"
// if textview is editable.
if ([textView isEditable])
[textView setEditable: NO];
请记住,根据所有这些规则命名您的访问器不仅仅是一个清晰和美观的问题。 Cocoa 在很大程度上依赖于 KVC,而 KVC 依赖于正确命名的访问器。
我想这会对你有所帮助。