第3章 接口與API設(shè)計(jì) 52條筆記
第15條: 用前綴避免命名空間沖突
Objective-C 沒(méi)有其他語(yǔ)言那種內(nèi)置的命名空間機(jī)制 。鑒于此,我們?cè)谄鹈麜r(shí)要設(shè)法避免潛在的命名沖突,否則很容易就重名了。如果發(fā)生命名沖突 naming clash ,那么應(yīng)用程序的連接過(guò)程就胡出錯(cuò)。
避免此問(wèn)題的唯一做法就是變相實(shí)現(xiàn)命名空間:為所有名稱都加上適當(dāng)?shù)那熬Y。
?
第16條: 提供全能初始化方法
把這種可為對(duì)象提供必要信息以便其能完成工作的初始化方法就做 指定初始化方法 designated initialzier.
如果創(chuàng)建實(shí)例的方法不止一種,那么這個(gè)類就會(huì)有多個(gè)初始化方法。不過(guò)要在其中選定一個(gè)作為designated initializer ,令其他初始化方法都來(lái)調(diào)用它。
上面幾個(gè)初始化方法中,initWithTimeIntervalSinceReferenceDate:是 designated initializer.
?
第23條:通過(guò)委托與數(shù)據(jù)源協(xié)議進(jìn)行對(duì)象間通信
該模式的主旨是 : 定義一套接口,某對(duì)象若想接受另一個(gè)對(duì)象的委托,則需要遵從此接口,以便成為其委托對(duì)象 delegate.而這另一個(gè)對(duì)象則可以給其委托對(duì)象回傳一些信息,也可以在發(fā)生相關(guān)事件時(shí)通知委托對(duì)象。
?
一般通過(guò)協(xié)議 這項(xiàng)語(yǔ)言特性來(lái)是實(shí)現(xiàn)此模式,整個(gè)Cocoa系統(tǒng)框架都是這么做的。
第24條: 將類的實(shí)現(xiàn)代碼分散到便于管理的數(shù)個(gè)分類之中
類中經(jīng)常容易填滿各種方法,而這些方法的代碼則全部堆在一個(gè)巨大的實(shí)現(xiàn)文件中。
通過(guò)Objective-C的分類機(jī)制,把類代碼按邏輯劃入幾個(gè)分區(qū)中,這對(duì)開(kāi)發(fā)與調(diào)試都有好處。
?
把個(gè)人信息建模為類。
可以用分類機(jī)制把剛才的類改寫成下面這樣:
現(xiàn)在,類的實(shí)現(xiàn)代碼按照方法分成了好幾個(gè)部分。所以說(shuō),這項(xiàng)語(yǔ)言特性當(dāng)然就叫做分類 啦 。
使用分類機(jī)制之后,依然可以把整個(gè)類都定義在一個(gè)接口文件中,并將其代碼寫在一個(gè)實(shí)現(xiàn)文件中。可是隨著分類數(shù)量增加,當(dāng)前這份實(shí)現(xiàn)文件很快就會(huì)膨脹。此時(shí),可以把每個(gè)分類提取到各自的文件中去。
以EOCPerson為例,可以按照其分類分成以下幾個(gè)文件:
通過(guò)分類機(jī)制,可以把類代碼分成很多易于管理的小塊,以便單獨(dú)檢視 。使用分類機(jī)制之后,如果想用分類中的方法,那么要記得在引入EOCPerson.h時(shí)一并引入分類的頭文件。
雖然稍微有點(diǎn)麻煩,不過(guò)分類仍然是一種管理代碼的好方法。
第25條:總是為第三方的分類名稱加前綴。
第26條: 勿在分類中聲明屬性
屬性是封裝數(shù)據(jù)的方式。盡管從技術(shù)上說(shuō),分類也可以聲明屬性,但這種做法應(yīng)該盡量避免。
關(guān)聯(lián)對(duì)象能夠解決在分類中不能合成實(shí)例變量的問(wèn)題。
這樣做可行,但不太理想。要把相似的代碼寫很多遍,而且在內(nèi)存管理問(wèn)題上容易出錯(cuò),因?yàn)槲覀冊(cè)跒閷傩詫?shí)現(xiàn)存取方法時(shí),經(jīng)常會(huì)忘記遵從其內(nèi)存管理語(yǔ)義。
盡管這個(gè)方法不壞,但筆者不推薦。
把屬性定義在主接口中要比定義在分類里清洗得多。
至于分類機(jī)制,則應(yīng)將其理解為一種手段,目標(biāo)在于擴(kuò)展類的功能。
有時(shí)候只讀屬性還是可以在分類中使用的。
由于獲取方法并不訪問(wèn)數(shù)據(jù),而且屬性也不需要由實(shí)例變量來(lái)實(shí)現(xiàn),所以可以像下面這樣來(lái)實(shí)現(xiàn)分類:
第27條: 使用class-continuation 分類 隱藏實(shí)現(xiàn)細(xì)節(jié)
第28條:通過(guò)協(xié)議提供匿名對(duì)象
協(xié)議定義了一系列方法,遵從此協(xié)議的對(duì)象應(yīng)該實(shí)現(xiàn)他們。于是,我們可以用協(xié)議把自己所寫的API只中的實(shí)現(xiàn)細(xì)節(jié)隱藏起來(lái),將返回的對(duì)象設(shè)計(jì)為遵從此協(xié)議的純id 類型。
在定義受委托者 delegate這個(gè)屬性時(shí),可以這樣寫
@PRoperty (nonatomic ,weak )id <EOCDelegate>delegate;
由于該屬性的類型是id<EOCDelegate>,所以實(shí)際上任何類的對(duì)象都能充當(dāng)這一屬性,即便該類不繼承自NSObject也可以,只有遵循EOCDelegat協(xié)議就行。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注