第十九条 使用清晰而协调的命名方式

2017/8/26 posted in  第三章 接口与API设计

我们在使用OC的时候,发现这门语言很繁琐,代码中一般有“in“,”for”,“with”等介词,其他编程语言则很少使用这些他们认为多余的字眼。以下面代码为例子:

NSString *text = @"The quick brown fox jumped over the lazy dog";
NSString *newText =
[text stringByReplacingOccurrencesOfString: @"fox",
                                withString:@"cat"];

但是,Objective-C的命名方式虽然长一点,但是却非常淸晰。

方法与变量名使用了“驼峰式大小写命名法"(camel casing)——以小写字母开头,其后每个单词首字母大写。类名也用驼峰命名法,不过其首字母要大写,而且前面通常还有两三个前缀字母。

方法命名

方法名很长对冉繁琐,但是易于阅读,理解其中的意思。但是如果过长会起到反效果。例如:

-(EOCRectangle*)union:(EOCRectangle*)rectangle // Unclear 
-(float) calculateTheArea // Too verbose

//应该改成
-(EOCRectangle*)unionRectangle:(EOCRectangle*)rectangle 
-(float) area

给方法命名时的注意事项可总结成下面几条规则:

  • 如果方法的返回值是新创建的,那么方法名的首个词应是返回值的类型,除非前面还 有修饰语,例如localizedString。属性的存取方法不遵循这种命名方式,因为一般认 为这些方法不会创建新对象,即便有时返回内部对象的一份拷贝,我们也认为那相当 于原有的对象。这些存取方法应该按照其所对应的属性来命名。
  • 应该把表示参数类型的名词放在参数前面。
  • 如果方法要在当前对象上执行操作,那么就应该包含动词;若执行操作时还需要参数, 则应该在动词后面加上一个或多个名词。
  • 不要使用str这种简称,应该用string这样的全称。
  • Boolean属性应加is前缀。如果某方法返回非属性的Boolean值,那么应该根据其功 能,选用has或is当前缀。
  • 将get这个前缀留给那些借由“输出参数”来保存返回值的方法,比如说,把返回值 填充到“C语言式数组”(C_style array)里的那种方法就可以使用这个词做前缀。

类与协议的命名

应该为类与协议的名称加上前缀,以避免命名空间冲突(参见第15条),而且应该像给 方法起名时那样把词句组织好,使其从左至右读起来较为通顺。例如,在NSArray的子类中,有一个用于表示可变数组的类,叫做NSMutableArray, mutable这个词放在array前面, 用以表明这是一种特殊的array(数组)。

例如iOS的UI库UIKit,其中协议与类的命名惯例为:

  • UIView (类)
  • UIViewController(类)
  • UITableView (类)
  • UITableViewController(类)
  • UITableViewDelegate(协议)

最重要的一点就是,命名方式应该协调一致。

要点

  • 起名时应遵从标准的Objective-C命名规范,这样创建出来的接口更容易为开发者所理解。
  • 方法名要言简意赅,从左至右读起来要像个日常用语中的句子才好。
  • 方法名里不要使用缩略后的类型名称。
  • 给方法起名时的第一要务就是确保其风格与你自己的代码或所要集成的框架相符。