第十八條:盡量使用不可變對(duì)象
這條主要講盡量使用不可變的對(duì)象,也就是在對(duì)外屬性聲明的時(shí)候要盡量加上readonly修飾,默認(rèn)是readwrite,這樣一來,在外部就只能讀取該數(shù)據(jù),而不能修改它,使得這個(gè)類的實(shí)例所持有的數(shù)據(jù)更加安全。如果外部想要修改,可以提供方法來進(jìn)行修改。
不要把可變的collection作為屬性公開,而應(yīng)提供相關(guān)方法,以此修改對(duì)象中的可變collection(這條個(gè)人感覺一般在常用、重要的類才有必要,畢竟也增加了不少代碼量)
//Language.h
@property (nonatomic, strong) NSSet *set;
應(yīng)該改為
//Language.h
@property (nonatomic, strong, readonly) NSSet *languages;
- (void)addLanguage:(NSString *)language;
- (void)removeLanguage:(NSString *)language;
//**.m
@implementation Language {
NSMutableSet *mutableLanguages;
}
- (NSSet *)languages {
return [_mutableLanguages copy];
}
- (void)addLanguage:(NSString *)language {
[_mutableLanguages addObject:language];
}
- (void)removeLanguage:(NSString *)language {
[_mutableLanguages removeObject:language];
}
第十九條:使用清晰而協(xié)調(diào)的命名方式
方法與變量名使用了“駝峰命名”,以小寫字母開頭,其后每個(gè)單詞首字母大寫。類名也用駝峰命名發(fā),不過其首字母需要大些。
雖說使用長(zhǎng)名字可以使代碼更易讀,也應(yīng)該盡量言簡(jiǎn)意賅。
使用方法命名時(shí),注意幾條規(guī)則:
- 如果方法的返回值是新創(chuàng)建的,那么方法名的首個(gè)詞應(yīng)是返回值類型,除非前面還有修飾語,例如localizedString。屬性的存取方法不遵循這種命名方式,因?yàn)橐话阏J(rèn)為這些方法不會(huì)創(chuàng)建新的對(duì)象,即便有時(shí)返回內(nèi)部對(duì)象的一份拷貝,我們也認(rèn)為那相當(dāng)于原有的對(duì)象。
- 應(yīng)該把表示參數(shù)類型的名詞放在參數(shù)前面。
- 如果方法要在當(dāng)前對(duì)象上執(zhí)行操作,那么就應(yīng)該包含動(dòng)詞;若執(zhí)行操作時(shí)還需要參數(shù),就在動(dòng)詞后面加上一個(gè)或多個(gè)名詞。
- 不要使用str這種簡(jiǎn)稱
- Boolean屬性應(yīng)該加is前綴。如果某方法返回非屬性的Boolean值,那么應(yīng)該根據(jù)其功能,選用has或is前綴。
- 由“輸入輸出”來保存返回值的方法用get前綴。
類與協(xié)議的命名:
命名方式應(yīng)該協(xié)調(diào)一致。如果從其他框架中繼承子類,那么務(wù)必遵循其命名慣例,例如,繼承自UIView的自定義子類,那么累名末尾的詞必須是view
總結(jié):
- 起名時(shí)應(yīng)遵從標(biāo)準(zhǔn)的Objective-C命名規(guī)范,這樣創(chuàng)建出來的接口更容易為開發(fā)者所理解。
- 方法名要言簡(jiǎn)意賅。
- 方法名里不要使用縮略后的類型名稱。
第二十條:為私有方法名加前綴
這條講的是應(yīng)該為類內(nèi)的私有方法增加前綴,以便區(qū)分,這個(gè)感覺因人而異吧,感覺只要你不隨便把私有方法暴露在.h文件都能接受
第二十一條:理解Objective-C錯(cuò)誤模型
很多語言都有異常處理機(jī)制,Objective-C也不例外,Objective-C也有類似的@throw,不過在OC中使用@throw可能會(huì)導(dǎo)致內(nèi)存泄漏,可能是它被設(shè)計(jì)的使用場(chǎng)景的問題。建議@throw只用來處理嚴(yán)重錯(cuò)誤,也可以理解為致命錯(cuò)誤(fatal error),那么處理一般錯(cuò)誤的時(shí)候(nonfatal error)時(shí)可以使用NSError。
NSError對(duì)象里封裝了3條信息:
1、Error domain(錯(cuò)誤范圍,其類型為字符串)
錯(cuò)誤范圍,也就是產(chǎn)生錯(cuò)誤的根源,通常用一個(gè)特有的全局變量來定義。例:NSURLErrorDomain來表示錯(cuò)誤范圍。
2、Error code(錯(cuò)誤碼,其類型為整數(shù))
表明在某一特定的范圍內(nèi)可能會(huì)發(fā)生一系列相關(guān)錯(cuò)誤,這些錯(cuò)誤通常采用enum來定義。
例:HTTP狀態(tài)碼
3、User info(用戶信息,其類型為字典)
有關(guān)些錯(cuò)誤的額外信息,其中或許包含一段“本地化的描述”(localized description)。或許還含有導(dǎo)致該錯(cuò)誤發(fā)生的另外一個(gè)錯(cuò)誤,經(jīng)由此種信息,可將相關(guān)錯(cuò)誤串成一條“錯(cuò)誤鏈”(chain of errors)。
第二十二條:理解NSCopying協(xié)議
在OC開發(fā)中,使用對(duì)象時(shí)經(jīng)常需要拷貝它,我們會(huì)通過copy/mutbleCopy來完成。如果想讓自己的類支持拷貝,那必須要實(shí)現(xiàn)NSCopying協(xié)議,只需要實(shí)現(xiàn)一個(gè)方法:
- (id)copyWithZone:(NSZone*)zone
當(dāng)然如果要求返回對(duì)象是可變的類型就要用到NSMutableCopying協(xié)議,相應(yīng)方法
在拷貝對(duì)象時(shí),需要注意拷貝執(zhí)行的是淺拷貝還是深拷貝。深拷貝在拷貝對(duì)象時(shí),會(huì)將對(duì)象的底層數(shù)據(jù)也進(jìn)行了拷貝。淺拷貝是創(chuàng)建了一個(gè)新的對(duì)象指向要拷貝的內(nèi)容。一般情況應(yīng)該盡量執(zhí)行淺拷貝。