@MicroCai
2016-05-20T12:11:05.000000Z
字数 2729
阅读 10364
Archives
iOS
《Effective Objective-C Notes》系列博文整理自《Effective Objective-C 2.0》
命名是 Objective-C 编程的重要环节。其他语言的开发者刚接触 iOS 时,可能会奇怪 Objective-C 为何会使用如此冗长啰嗦的方法、变量、类的命名方式,其实这里头确实有文章。
Objective-C 形成这种命名方式的主要原因有两个:
- 为了代码更好的可读性;
- 防止命名冲突;
Objective-C 的命名通常都比较长,名称遵循驼峰式命名法,而且名字中一般都带有 in
、for
、by
、with
等介词,读起来像句子一样,非常易于理解。通常一个命名较好的代码,就能够做到在开发者一看到名字时,就懂得它的含义和使用方法。
举个栗子,下面是 NSString 的一个实例方法
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target
withString:(NSString *)replacement
方法是这样调用的
[stringValue stringByReplacingOccurrencesOfString:@"sourceString"
withString:@"destinationString"]
我们可以将上面的方法调用变成下面的这样一句简单的英文(请暂时忽略英文语法)
replacing
stringValue
occurences stringsourceString
with stringdestinationString
如此一拆解,方法的含义便明白,这个方法的意思就是
将
stringValue
字符串的子串sourceString
替换成destinationString
。第一个参数就是要替换的源字符串,第二个是要替换的目的字符串。
我并没有在文中为 NSString 的这个方法加上注释,仅仅是通过名字就可以知道方法含义、调用方式等等信息,可见 Objective-C 代码命名规范的好处甚多。
需要规范代码命名的另一个非常重要的原因是 Objective-C 没有命名空间(name space),如果不按照较为规范的命名方式,极易产生冲突。导致程序有可能在链接时出现重复符号(duplicate symbol)而无法通过编译,或者直接在运行时崩溃。避免此问题的唯一办法就是为所有名称加上适当前缀,变相实现命名空间。前缀可以是与公司、应用程序或二者相关的关联名称。由于苹果公司保留使用“两字母前缀”的所有权,所以第三方代码的前缀应取三个字母为宜。应用程序中的所有名称包括类名、分类方法名、全局变量名、C 函数名等等,都应该加上前缀。
举个栗子,假设你所在的公司叫做 Effective Widgets,那么就可以将前缀定为EWS,如果在应用程序的有个类名叫 MenuViewController
,加上前缀之后,其实际的名字应该命名为 EWSMenuViewController
。这么做的好处非常多,不仅大大降低了命名冲突的概率,还能在出问题时,根据栈的回溯信息,立即定位到问题所属的代码模块。
做了这么多铺垫,就是为了说明 Objective-C 命名的两大原则:1、可读性高;2、加前缀防止命名冲突。Objective-C 的命名基本遵循 驼峰命名法,在名字中除首字母外的每个单词都用大写字母来标记。如果首字母大写,则为大驼峰法;首字母小写,则为小驼峰法。为什么是基本遵循呢?因为前缀的影响,有些名字并不符合驼峰命名法。
给方法命名的规则
str
这种简称,应该用 string
这样的全称。localizedString
。属性的存取方法不遵循这种命名方式,因为一般认为这些方法不会创建新对象,即使有时返回内部对象的拷贝,也认为那相当于原有的对象。这些存取方法应该按照其所对应的属性来命名。+ (instancetype)stringWithString:(NSString *)string;
。is
前缀,如 - (BOOL)isEqualToString:(NSString *)aString;
。如果某方法返回非属性的 Boolean
值,那么应该根据其功能,选用 has
或 is
当前缀,如 - (BOOL)hasPrefix:(NSString *)aString;
。get
这个前缀留给那些借由输出参数来保存返回值的方法,比如说把返回值填充到 C 语言式数组里的那种方法,就可以使用这个词做前缀,如 - (void)getCharacters:(unichar *)buffer;
。类与协议的命名
给私有方法加前缀
常量命名
k
,如 static const NSTimeInterval kAnimationDuration = 0.3;
。为什么会是 k
呢?这其实是历史原因,在匈牙利命名法中,k
的意思是 constants,用以表示常量前缀。extern NSString *const EOCStringConstant;
。类别命名
UIKit+AFNetworking.h
。命名规范的内容其实很多,本文仅作为一个引子,希望能引起各位同学对命名规范的重视。和命名规范同样重要的还有代码书写规范,各位童鞋可以直接 Google 搜索 Objective-C Convention
,即可找到一些不错的资源。
相关阅读:
[1] Introduction to Coding Guidelines for Cocoa
[2] Cocoa Style for Objective-C
[3] Learn Objective-C: Cocoa Naming Conventions