Effective Objective-C 2.0(52个有效方法) —— 接口与API设计 读书笔记

这里写图片描述

15、用前缀避免命名空间冲突
选择与你的公司、应用程序或二者皆有关联之名称作为类名的前缀,并在所有代码中均使用这一前缀,前缀字母应该大于2个字母(Apple 宣称其保留使用所有“两字母前缀”(two-letter-prefix)的权利)
若自己所开发的程序库中用到了第三方库,则应为其中的名称加上前缀
这里写图片描述
若应用程序自身和其所用的程序库都引入了同名的第三方库,则后者应加前缀以避免命名冲突

16、提供“全能初始化方法”
“全能初始化方法”可为对象提供必要信息以便其能完成工作的初始化方法。也就是说,其余的初始化方法都要调用它;
在类中提供一个全能初始化方法,并于文档里指明。其他初始化方法均应调用此方法
若全能初始化方法与超类不同,则需覆写超类中的对应方法
如果超类的初始化方法不适应于子类,那么应该覆写这个超类方法,并在其中抛出异常。

- (id)initWithWidth:(float)width andHeight:(float)height;

17、实现description方法
实现description方法返回一个有意义的字符串,用以描述该实例
若想在调试试打印出更详尽的对象描述信息,则应实现debugDescription方法。(po)

- (NSString *)description
{
    return [NSString stringWithFormat:@"<%@: %p, \%@ %@\>",[self class], self, _name, _age];
}

- (NSString *)debugDescription {
    return [NSString stringWithFormat:@"<%@: %p, \%@ %@\>",[self class], self, _name, _age];
}

18、尽量使用不可变对象
尽量创建不可变的对象;
某属性仅可于对象内部修改,则在“class-continuation分类”中将其由readonly属性扩展为readwrite属性
不要把可变的collection作为属性,而应提供相关方法,以此修改对象中的可变collection;

19、使用清晰而协调的命名方式
起名时应遵从标准的Objective-C命名规范,这样创建出来的接口更容易为开发者所理解
方法名要言简意赅,从左至右读起来要像个日常用语中的句子才好
方法名里不要使用缩略后的类型名称
给方法起名时的第一要务就是确保其风格与你自己的代码或所要集成的框架相符
方法名字中常用字:for,to,and ,in,with
方法命名
如果方法的返回值是新创建的,那么方法名的首个词应是返回值得类型。(string)除非前面还有修饰语。例如localizedString,属性的存取方法不遵守这种命名方式,因为一般认为这些方法不会创建新对象,即便有时返回内部对象的一份拷贝,我们也认为那相当于原有的对象。这些存取方法应该按照其所对应的属性来命名(localized);
应该把表示参数类型的名词放在参数前面(intValue)
如果方法要在当前对象上执行操作。那么就应该包含动词,若执行操作时还需要参数,则应该在动词后面加上一个或多个名词(getCharacter:range:)
不要使用str这种简称,应该用string这样的全称
Boolean属性应加is前缀,如果某方法返回非属性的Boolean值,那么应该根据其功能,选用has或is当前缀
get这个前缀留给那些借由“输出参数”来保存返回值的方法,比如说:把返回值填充到“C语言式数组”里的那种方法就可以使用这个词做前缀;

类与协议的命名
应该为类与协议的名称加上前缀。

20、为私有方法名加前缀
给私有方法的名称加上前缀。这样可以很容易地将其同公共方法区分开(p_
不要单用一个下划线做私有方法的前缀,因为这种做法是预留给苹果公司用的

Objective-C语言没办法将方法标为私有,因为每个对象都可以响应任意消息,而且可在运行期检视某个对象所能直接响应的消息,根据给定的消息查出其对应的方法。这一工作要在运行期才能完成。所以Objective-C中没有那种约束方法调用的机制用以限制谁能调用此方法,能在哪个对象上调用此方法以及何时能调用此方法。

21、理解Objective-C错误模型
只有发生了可使整个应用程序崩溃的严重错误时,才应使用异常

 @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"reason" userInfo:nil]

在错误不那么严重的情况下,可以指派“委托方法(delegate method)”来出来错误,也可以把错误信息放在NSError 对象里,经由“输出参数”返回给调用者;
NSError 对象里封装了三条信息:
Error domain(错误范围,其类型为字符串)
Error code(错误码,其类型为整数)
User info(用户信息,其类型为字典)

22、理解NSCopying协议
若想令自己所写的对象具有拷贝功能,则需实现NSCopying协议
如果自定义的对象分为可变版本与不可变版本,那么就要同时实现NSCopying与NSMutableCopying协议

- [NSMutableArray copy] =>  NSArray
- [NSArray mutableCopy] => NSMutableArray

复制对象时需决定采用浅拷贝还是深拷贝,一般情况下应该尽量执行浅拷贝 (Foundation框架中的所有collection类在默认情况下都执行浅拷贝)
如果你所写的对象需要深拷贝,那么可考虑新增一个专门执行深拷贝的方法

这里写图片描述
浅拷贝与深拷贝对比图。浅拷贝之后的内容与原始内容均指向相同对象,而深拷贝之后的内容所指的对象是原始内容中相关对象的一份拷贝

猜你喜欢

转载自blog.csdn.net/heqiang2015/article/details/82628165