保持公共 API 简单

Tip

保持类简单;避免 “厨房水槽(kitchen-sink)” 式的 API。如果一个函数压根没必要公开,就不要这么做。用私有类别保证公共头文件整洁。

与 C++ 不同,Objective-C 没有方法来区分公共的方法和私有的方法 – 所有的方法都是公共的(译者注:这取决于 Objective-C 运行时的方法调用的消息机制)。因此,除非客户端的代码期望使用某个方法,不要把这个方法放进公共 API 中。尽可能的避免了你你不希望被调用的方法却被调用到。这包括重载父类的方法。对于内部实现所需要的方法,在实现的文件中定义一个类别,而不是把它们放进公有的头文件中。

  1. // GTMFoo.m
  2. #import "GTMFoo.h"
  3.  
  4. @interface GTMFoo (PrivateDelegateHandling)
  5. - (NSString *)doSomethingWithDelegate; // Declare private method
  6. @end
  7.  
  8. @implementation GTMFoo(PrivateDelegateHandling)
  9. ...
  10. - (NSString *)doSomethingWithDelegate {
  11. // Implement this method
  12. }
  13. ...
  14. @end

Objective-C 2.0 以前,如果你在私有的 @interface 中声明了某个方法,但在 @implementation 中忘记定义这个方法,编译器不会抱怨(这是因为你没有在其它的类别中实现这个私有的方法)。解决文案是将方法放进指定类别的 @implemenation 中。

如果你在使用 Objective-C 2.0,相反你应该使用 类扩展 来声明你的私有类别,例如:

  1. @interface GMFoo () { ... }

这么做确保如果声明的方法没有在 @implementation 中实现,会触发一个编译器告警。

再次说明,“私有的” 方法其实不是私有的。你有时可能不小心重载了父类的私有方法,因而制造出很难查找的 Bug。通常,私有的方法应该有一个相当特殊的名字以防止子类无意地重载它们。

Ojbective-C 的类别可以用来将一个大的 @implementation 拆分成更容易理解的小块,同时,类别可以为最适合的类添加新的、特定应用程序的功能。例如,当添加一个 “middle truncation” 方法时,创建一个 NSString 的新类别并把方法放在里面,要比创建任意的一个新类把方法放进里面好得多。