[Note] Effective OC - Item 19~22

Chapter 3. Interface and API Design

<br />


Item 19: Use Clear and Consistent Naming

<br />
這一節(jié)講的是編程三大難題之一:變量與函數(shù)的命名。
其實(shí)并沒(méi)有講變量的命名...大概是因?yàn)樽兞慷际敲~偿枕,只有我們這種非母語(yǔ)的人才會(huì)糾結(jié)吧_(:з」∠)_ 這一節(jié)內(nèi)容在文檔Coding Guidelines for Cocoa。
OC的方法格式看習(xí)慣了還挺喜歡的。非常有人文關(guān)懷悔捶。長(zhǎng)是長(zhǎng)了恃逻,一看就明白晶府,第一次見(jiàn)也不用查方法是要做什么,各個(gè)參數(shù)代表什么抢埋,這就是我們常說(shuō)的犧牲空間換時(shí)間(誤)。文中實(shí)力嘲諷了C++和java的方法命名督暂,對(duì)比展示OC命名優(yōu)越性揪垄。
具體說(shuō)來(lái)有以下幾個(gè)注意:

  • 不使用簡(jiǎn)稱(chēng)。
  • 不要濫用“get”逻翁。然而這一點(diǎn)文中的敘述我并不是特別明白…
  • 關(guān)于長(zhǎng)句子的方法名饥努,有返回值的,返回值所表示的名詞放在最前面八回,后面每個(gè)參數(shù)酷愧,類(lèi)型聲明之前都應(yīng)該是這個(gè)參數(shù)代表的名詞。不需要寫(xiě)and缠诅。動(dòng)詞和介詞放在中間溶浴。
  • init和工廠方法仿照官方來(lái)寫(xiě),基本上是加with管引。
  • 代理方法盡量以本類(lèi)作為開(kāi)頭士败。
  • 類(lèi)和代理名都要加前綴,代理名就用類(lèi)名+delegate褥伴。

說(shuō)起來(lái)谅将,命名這種事情,和語(yǔ)言一樣重慢,還是得文檔看得多了才能比較有感覺(jué)吧戏自。
<br />


Item 20: Prefix Private Method Names

<br />
這一節(jié)很短,說(shuō)的是為private method加前綴伤锚。
表示驚嚇( ⊙ o ⊙ )擅笔。我從來(lái)沒(méi)給private method加過(guò)前綴…
好處有二:

  • 一是在調(diào)試中可以清楚地看清哪些方法是private志衣,哪些方法是public。
  • 二是知道了是private就明白不會(huì)影響外界API猛们,方便改動(dòng)念脯。而其余的public method改動(dòng)起來(lái)就要更三思。

我覺(jué)得這兩條其實(shí)說(shuō)的是一回事弯淘。
具體添加什么前綴呢绿店。并不是類(lèi)名那種三個(gè)字母的前綴。文中推薦的是子母+下劃線的形式庐橙,比如’p_’假勿。不要只用一個(gè)下劃線,以免和官方的方法名相沖突态鳖。
<br />


Item 21: Understand the Objective-C Error Model

<br />
這一節(jié)主要講NSError的使用转培。
開(kāi)頭先說(shuō)了NSException。NSException是遇到fatal error時(shí)才會(huì)使用的浆竭,拋出異常以后程序也應(yīng)該直接終止浸须,這樣就不用再關(guān)心因?yàn)閽伋霎惓6鵁o(wú)法執(zhí)行后面釋放資源的代碼,使得內(nèi)存泄露的問(wèn)題了邦泄。但如果是比較小的錯(cuò)誤删窒,并不希望程序因此退出,所以如果能用NSError處理就不要使用它顺囊。
NSError的詳細(xì)使用參照Error Handling Programming Guide肌索。
常用到的三個(gè)屬性是code,domain和userInfo特碳,因?yàn)槌跏蓟椒ㄐ枰_定的就是這三個(gè)參數(shù)驶社。三個(gè)屬性都是readonly的。
domain -> code -> user info 按順序?qū)﹀e(cuò)誤提供越來(lái)越詳細(xì)的描述测萎。domain可以看到是哪個(gè)系統(tǒng)出錯(cuò)亡电,code可以看到錯(cuò)誤的具體名字,一般采用enum來(lái)定義硅瞧,看到code已經(jīng)可以明白是什么錯(cuò)了份乒,或者已經(jīng)可以復(fù)制到搜索欄了...user info是一個(gè)字典,里面的信息更加詳細(xì)腕唧。
文中列舉了兩個(gè)常見(jiàn)的使用場(chǎng)景或辖。
一種是作為待處理的傳入?yún)?shù),像這樣:

- (void)connection:(NSURLConnection *)connection didFailWithError: (NSError *)error

這種在網(wǎng)絡(luò)傳輸相關(guān)的函數(shù)和block里都很常見(jiàn)枣接。
第二種我還沒(méi)見(jiàn)過(guò)颂暇,是作為輸出參數(shù)回調(diào),像這樣:

- (BOOL)doSomethig:(NSError **)error

回調(diào)以后的用法:

NSError *error = nil;
BOOL ret = [object doSomething: &error];
if (error){
    \\
}

也就是說(shuō)但惶,方法調(diào)用的時(shí)候傳遞的是error的指針耳鸯,調(diào)用完成后通過(guò)這個(gè)指針就直接能得到error對(duì)象和里面的信息了湿蛔,雖然是作為參數(shù)傳進(jìn)去的,作用卻類(lèi)似于返回值县爬。并且阳啥,在方法執(zhí)行完畢后,系統(tǒng)會(huì)保證這個(gè)error對(duì)象可以自動(dòng)釋放财喳。
<br />


Item 22: Understand the NSCopying Protocol

<br />
這一節(jié)講應(yīng)該怎樣為自定義類(lèi)實(shí)現(xiàn)NSCopying協(xié)議察迟。
NSCopying協(xié)議是針對(duì)可以允許copy操作的類(lèi)。實(shí)現(xiàn)這個(gè)協(xié)議耳高,如果是普通的類(lèi)扎瓶,只需要實(shí)現(xiàn)一個(gè)方法:

- (id)copyWithZone: (NSZone *)zone

而如果是有immutable和mutable兩個(gè)版本的類(lèi),則需要實(shí)現(xiàn)兩個(gè)方法:

- (id)copyWithZone:(NSZone *)zone
- (id)mutableCopyWithZone:(NSZone *)zone

也就是說(shuō)泌枪,當(dāng)我們調(diào)用[someObject copy];[someObject mutableCopy]時(shí)概荷,背后調(diào)用的就是這兩個(gè)方法。這里的zone參數(shù)編程的時(shí)候都不用去管它工闺,交給系統(tǒng)自動(dòng)完成。
默認(rèn)習(xí)慣是瓣蛀,copy返回的是immutable對(duì)象陆蟆,mutableCopy返回的是mutable對(duì)象,不管原對(duì)象可變與否惋增,copy出來(lái)的新對(duì)象都是這個(gè)規(guī)律叠殷。
就方法的具體寫(xiě)法來(lái)說(shuō),就是創(chuàng)建一個(gè)新的對(duì)象诈皿,把需要copy的值賦值給這個(gè)新的對(duì)象林束,然后返回即可。文中有一個(gè)EOCPerson的例子稽亏,很清晰壶冒。
系統(tǒng)的所有collection默認(rèn)情況下執(zhí)行的是shallow copy,所以一般我們也是這么做截歉。如果非常想做deepCopy胖腾,也可以專(zhuān)門(mén)再寫(xiě)一個(gè)deepCopy方法,比如系統(tǒng)的NSSet就有專(zhuān)門(mén)的深拷貝init方法瘪松,在寫(xiě)deepCopy時(shí)可以對(duì)所需copy的屬性調(diào)用這個(gè)方法咸作,就可以實(shí)現(xiàn)整個(gè)類(lèi)的deep copy了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宵睦,一起剝皮案震驚了整個(gè)濱河市记罚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌壳嚎,老刑警劉巖桐智,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件末早,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡酵使,警方通過(guò)查閱死者的電腦和手機(jī)荐吉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)口渔,“玉大人样屠,你說(shuō)我怎么就攤上這事∪甭觯” “怎么了痪欲?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)攻礼。 經(jīng)常有香客問(wèn)我业踢,道長(zhǎng),這世上最難降的妖魔是什么礁扮? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任知举,我火速辦了婚禮,結(jié)果婚禮上太伊,老公的妹妹穿的比我還像新娘雇锡。我一直安慰自己,他們只是感情好僚焦,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布锰提。 她就那樣靜靜地躺著,像睡著了一般芳悲。 火紅的嫁衣襯著肌膚如雪立肘。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天名扛,我揣著相機(jī)與錄音谅年,去河邊找鬼。 笑死肮韧,一個(gè)胖子當(dāng)著我的面吹牛踢故,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惹苗,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼殿较,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了桩蓉?” 一聲冷哼從身側(cè)響起淋纲,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎院究,沒(méi)想到半個(gè)月后洽瞬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體本涕,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年伙窃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了菩颖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡为障,死狀恐怖晦闰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鳍怨,我是刑警寧澤呻右,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站鞋喇,受9級(jí)特大地震影響声滥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侦香,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一落塑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧罐韩,春花似錦憾赁、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)膘壶。三九已至错蝴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間颓芭,已是汗流浹背顷锰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亡问,地道東北人官紫。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像州藕,于是被迫代替她去往敵國(guó)和親束世。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理床玻,服務(wù)發(fā)現(xiàn)毁涉,斷路器,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法锈死,類(lèi)相關(guān)的語(yǔ)法贫堰,內(nèi)部類(lèi)的語(yǔ)法穆壕,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法其屏,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,598評(píng)論 18 399
  • 寫(xiě)在最前面: 這是我讀這本書(shū)的第一遍喇勋,目前暫定為1.0版本吧。很多地方都還沒(méi)有很好的理解透徹偎行,只是理解到了一點(diǎn)皮毛...
    LaiYoung_閱讀 1,811評(píng)論 4 18
  • 事情是這樣的川背,就跟大多數(shù)穿越網(wǎng)文的主角一樣,我們的主角張啟是個(gè)屌絲睦优。 不過(guò)與眾不同的是渗常,張啟是個(gè)愛(ài)看網(wǎng)...
    狗子是只慫貓閱讀 1,081評(píng)論 5 13
  • 很小的時(shí)候,就有人告訴我汗盘,生活充滿了酸甜苦辣各種味道皱碘。我似懂非懂地點(diǎn)點(diǎn)頭,內(nèi)心卻并沒(méi)有真正體會(huì)到∫酰現(xiàn)在想來(lái)癌椿,原來(lái)生...
    沂河生閱讀 380評(píng)論 2 1