接口與API設(shè)計
我們在編寫接口時應(yīng)將其設(shè)計成易于復(fù)用的形式,這需要用到Objective-C語言中常見的編程范式(paradigm)。
15.用前綴避免命名空間沖突
Objective-C沒有其他語言那種內(nèi)置的命名空間(namespace)機制。避免此問題的唯一辦法就是變相實現(xiàn)命名空間:為所有名稱都加上適當(dāng)前綴。
使用Cocoa創(chuàng)建應(yīng)用程序時一定要注意,Apple宣稱其保留使用所有“兩字母前綴”(two-letter prefix)的權(quán)利,所以你自己選用的前綴應(yīng)該是三個字母的。
選擇與你的公司、應(yīng)用程序或二者皆有關(guān)聯(lián)之名稱作為類名的前綴,并在所有代碼中均使用這一前綴。
若自己所開發(fā)的程序庫中用到了第三方庫,則應(yīng)為其中的名稱加上前綴。
16.提供“全能初始化方法”
在類中提供一個全能初始化方法,并于文檔里指明。其它初始化方法均應(yīng)調(diào)用此方法。
若全能初始化方法與超類不同,則需覆寫超類中的對應(yīng)方法。
如果超類的初始化方法不適用與子類,那么應(yīng)該覆寫這個超類方法,并在其中拋出異常。
// Using Default values
- (id) init {
return [self initWithWidth:5.0f andHeight:10.0f];
}
// Throwing an exception
- (id) init {
@throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Must use initWithWidth:andHeight: instead." userInfo:nil];
}
17.實現(xiàn)description方法
實現(xiàn)description方法返回一個有意義的字符串,用以描述該實例。
debugDescription方法是開發(fā)者在調(diào)試器(debugger)中以控制臺命令打印對象時才調(diào)用的。在NSObject類的默認實現(xiàn)中,此方法只是直接調(diào)用了description。
若想在調(diào)試時打印出更詳盡的對象描述信息,則應(yīng)實現(xiàn)debugDescription方法。
18.盡量使用不可變對象
若某屬性僅可于對象內(nèi)部修改,則在“class-continuation分類”中將其由readonly屬性擴展為readwrite屬性。
不要把可變的collection作為屬性公開,而應(yīng)該提供相關(guān)方法,以此修改對象中的可變collection。
19.使用清晰而協(xié)調(diào)的命名方式
起名時應(yīng)遵從標(biāo)準(zhǔn)的Objective-C命名規(guī)范,這樣創(chuàng)建出來的接口更容易為開發(fā)者所理解。
方法名要言簡意賅,從左至右讀起來要像個日常用語中的句子才好。
方法名里不要使用縮略后的類型名稱。
給方法起名時的第一要務(wù)就是確保其風(fēng)格與你自己的代碼或所要集成的框架相符。
20.為私有方法名加前綴
給私有方法的名稱加上前綴,這樣可以很容易地將其同公共方法區(qū)分開。
不要單用一個下劃線做私有方法的前綴,因為這種做法是預(yù)留給蘋果公司用的。
21.理解Objective-C錯誤模型
只有發(fā)生了可使整個應(yīng)用程序崩潰的嚴重錯誤時,才應(yīng)使用異常。
在錯誤不那么嚴重的情況下,可以指派“委托方法”(delegate method)來處理錯誤,也可以把錯誤信息放在NSError對象里,經(jīng)由“輸出參數(shù)”返回給調(diào)用者。
22.理解NSCopying協(xié)議
若想令自己所寫的對象具有拷貝功能,則需實現(xiàn)NSCopying協(xié)議。
如果自定義的對象分為可變版本與不可變版本,那么就要同時實現(xiàn)NSCopying與NSMutableCopying協(xié)議。
復(fù)制對象時需決定采用淺拷貝還是深拷貝,一般情況下應(yīng)該盡量執(zhí)行淺拷貝。
如果你所寫的對象需要深拷貝,那么可考慮新增一個專門執(zhí)行深拷貝的方法。