接口與 API設(shè)計(jì)
15 用前綴避免命名空間沖突
- 選擇與你公司、應(yīng)用程序或者二者皆有關(guān)聯(lián)之名稱(chēng)作為類(lèi)名的前綴鞭盟,并在所有代碼中均使用這一前綴。Apple宣稱(chēng)保留使用所有兩字母前綴的權(quán)利,所以自己所選用的前綴最好是三字母的。不僅類(lèi)名要加, 還要注意Category, 類(lèi)實(shí)現(xiàn)文件中定義的全局變量以及純C函數(shù)(這些定義會(huì)出現(xiàn)在全局符號(hào)表, 容易引起命名沖突).
- 若自己所開(kāi)發(fā)的程序庫(kù)中用到了第三方庫(kù)汇跨,則應(yīng)為其中的名稱(chēng)加上前綴(個(gè)人認(rèn)為, 此條待考察, 加上后會(huì)影響第三方庫(kù)的升級(jí))。
16 提供“全能初始化方法”
- 在類(lèi)中提供一個(gè)(或多個(gè), 如 NSCoding 協(xié)議的 init?WithCoder)全能初始化方法妆距,并于文檔里指明穷遂。其它初始化方法均應(yīng)調(diào)用此方法。
- 若全能初始化方法與超類(lèi)不同娱据,則需覆寫(xiě)超類(lèi)中對(duì)應(yīng)方法塞颁。
- 如果超類(lèi)的初始化方法并不適用于子類(lèi),那么應(yīng)該覆寫(xiě)這個(gè)超類(lèi)方法吸耿,并在其中拋出異常(@throw NSException)祠锣。
17 實(shí)現(xiàn)description方法
- 實(shí)現(xiàn)description方法返回一個(gè)有意義的字符串,用以描述該實(shí)例(可以自定義NSLog 中的輸出內(nèi)容, 必要的可以包括類(lèi)名等, 可以將具體信息封裝在一個(gè) Dictionary 中, 可以方便的得到格式化的輸出)咽安。
- 若想在調(diào)試時(shí)打印出更詳盡的對(duì)象描述信息伴网,則應(yīng)該實(shí)現(xiàn)debugDescription方法。該方法可以斷點(diǎn)調(diào)試時(shí)可以, 斷點(diǎn)中斷后, 在控制臺(tái)中輸出"po varName(變量名稱(chēng))", 可
18 盡量使用不可變對(duì)象
- 盡量創(chuàng)建不可變的對(duì)象(通過(guò)定義readonly 的屬性, 注意集合是否是可變的, 盡量通過(guò)暴露的方法讓用戶(hù)調(diào)用來(lái)改變集合的內(nèi)容)妆棒。
- 若某屬性?xún)H可于對(duì)象內(nèi)部修改澡腾,則在“class-continuation分類(lèi)”中將其由readonly屬性擴(kuò)展為readwrite屬性沸伏。
- 不要把可變的collection作為屬性公開(kāi),而應(yīng)提供相關(guān)方法动分,一次修改對(duì)象中的可變collection毅糟。
19 使用清晰而協(xié)調(diào)的命名方式
- 起名時(shí)應(yīng)遵從標(biāo)準(zhǔn)的Objective-C命名規(guī)范,這樣創(chuàng)建出來(lái)的接口更容易為開(kāi)發(fā)者所理解澜公。
- 方法名要言簡(jiǎn)意賅姆另,從左至右讀起來(lái)要像個(gè)日常用語(yǔ)中的句子才好。
- 方法名利不要使用縮略后的類(lèi)型名稱(chēng)坟乾。
- 給方法嗎起名時(shí)的第一要?jiǎng)?wù)就是確保其風(fēng)格與你自己的代碼或所要集成的框架相符迹辐。
20 為私有方法名加前綴
- 給私有方法的名稱(chēng)加上前綴,這樣可以很容易的將其通公共方法區(qū)分開(kāi)甚侣。
- 不要單用一個(gè)下劃線(xiàn)做私有方法的前綴明吩,因?yàn)檫@種做法的預(yù)留給蘋(píng)果公司用的。
21 理解Objective-C錯(cuò)誤模型
- 只有發(fā)生了可使整個(gè)應(yīng)用程序崩潰的嚴(yán)重錯(cuò)誤時(shí)殷费,才使用異常印荔。OC在 ARC開(kāi)啟后, 發(fā)生了異常也不能保證資源的釋放, 因此不是"異常完全"的. (個(gè)人認(rèn)為拋出異常一般用于告訴調(diào)用者哪些方法未實(shí)現(xiàn)或者隱藏了父類(lèi)的行為等, 在調(diào)試時(shí)就可以發(fā)現(xiàn)問(wèn)題)
- 在錯(cuò)誤不那么嚴(yán)重的情況下,可以指派委托方法來(lái)處理錯(cuò)誤详羡,也可把錯(cuò)誤信息放在NSError對(duì)象里仍律,經(jīng)由輸出參數(shù)返回給調(diào)用者。
22 理解NSCopying協(xié)議
- 若想令自己所寫(xiě)的對(duì)象具有拷貝功能殷绍,則需實(shí)現(xiàn)NSCopying協(xié)議染苛。
- 如果自定義的對(duì)象分為可變版本與不可變版本,那么就要同時(shí)實(shí)現(xiàn)NSCopying與NSMutableCopying協(xié)議主到。
復(fù)制對(duì)象時(shí)需決定采用淺拷貝還是深拷貝茶行,一般情況下應(yīng)該盡量執(zhí)行淺拷貝。
如果你所寫(xiě)的對(duì)象需要深拷貝登钥,那么可考慮新增一個(gè)專(zhuān)門(mén)執(zhí)行深拷貝的方法畔师。
協(xié)議與分類(lèi)
23 通過(guò)委托與數(shù)據(jù)源協(xié)議進(jìn)行對(duì)象間通信
委托屬性需定義成 weak, 因?yàn)閮啥疾⒎菗碛械牟⑾? 不然會(huì)產(chǎn)生 retain circle. protocol 可以通過(guò)@optional 定義非強(qiáng)制實(shí)現(xiàn)的方法, 當(dāng)調(diào)用時(shí)需要向?qū)ο蟀l(fā)送 respondsToSelector:消息, 確定方法是否被實(shí)現(xiàn)了
- 委托模式為對(duì)象提供了一套接口,使其可由此將相關(guān)事件告知其他對(duì)象(如UITableViewDelegate)牧牢。
- 將委托對(duì)象應(yīng)該支持的接口定義成協(xié)議看锉,在協(xié)議中把可能需要處理的事件定義成方法。
- 當(dāng)某對(duì)象需要從另外一個(gè)對(duì)象中獲取數(shù)據(jù)時(shí)塔鳍,可使用委托模式伯铣。在這種情況下,該模式亦稱(chēng)數(shù)據(jù)源協(xié)議(如 UITableViewDataSource)轮纫。
- 若有必要腔寡,可實(shí)現(xiàn)含有位段的結(jié)構(gòu)體,將委托對(duì)象是否能響應(yīng)相關(guān)協(xié)議方法這一信息緩存至其中掌唾。該方法的目的將可選方法的實(shí)現(xiàn)情況通過(guò)結(jié)構(gòu)體緩存起來(lái), 用結(jié)構(gòu)的每一位表示某一個(gè)方法是否實(shí)現(xiàn)了,以上.
24 將類(lèi)的實(shí)現(xiàn)代碼分散到便于管理的數(shù)個(gè)分類(lèi)之中
- 使用分類(lèi)機(jī)制把類(lèi)的實(shí)現(xiàn)代碼劃分成易于管理的小塊放前。分類(lèi)文件的全名可以采用 ClassName+CategoryName(.h/.m)
- 將應(yīng)該視為私有的方法歸入名叫Private的分類(lèi)中忿磅,以隱藏實(shí)現(xiàn)細(xì)節(jié)。
25 總是為第三方類(lèi)的分類(lèi)名稱(chēng)加前綴
- 向第三方類(lèi)中添加分類(lèi)時(shí)凭语,總應(yīng)給其名稱(chēng)加上你專(zhuān)用的前綴葱她。
- 向第三方類(lèi)中添加分類(lèi)時(shí),總應(yīng)給其中的方法名加上你專(zhuān)用的前綴似扔。
26 勿在分類(lèi)中聲明屬性
- 把封裝數(shù)據(jù)所用的全部屬性都定義在主接口里吨些。分類(lèi)中定義的屬性不能自動(dòng)合成存取方法.
- 在class-continuation分類(lèi)之外的其他分類(lèi)中,可以定義存取方法虫几,但盡量不要定義屬性锤灿。
27 使用class-continuation分類(lèi)隱藏實(shí)現(xiàn)細(xì)節(jié)(就是 Extension)
- 通過(guò)class-continuation分類(lèi)向類(lèi)中新增實(shí)例變量挽拔。
- 如果某屬性在主接口中聲明為只讀辆脸,而類(lèi)的內(nèi)部又要用設(shè)置方法修改此屬性,那么就在class-continuation分類(lèi)中將其擴(kuò)展為可讀寫(xiě)螃诅。
- 把私有方法的原型聲明在class-continuation分類(lèi)里面啡氢。
- 若想使類(lèi)遵循的協(xié)議不為人所知,則可于class-continuation分類(lèi)中聲明术裸。
28 通過(guò)協(xié)議提供匿名對(duì)象
本節(jié)總起來(lái)就是通過(guò)基于協(xié)議的多態(tài)特性, 定義 id<ProtocolType>類(lèi)型的指針, 可以指向任何實(shí)現(xiàn)了協(xié)議的對(duì)象.
- 協(xié)議可在某種程度上提供匿名類(lèi)型倘是。具體的對(duì)象類(lèi)型可以淡化成遵從某些一的id類(lèi)型,協(xié)議里規(guī)定了對(duì)象所應(yīng)實(shí)現(xiàn)的方法袭艺。
- 使用匿名對(duì)象來(lái)隱藏類(lèi)型名稱(chēng)或類(lèi)名搀崭。
- 如果具體類(lèi)型不重要,重要的是對(duì)象能夠響應(yīng)(定義在協(xié)議里的)特定方法猾编,那么可使用匿名對(duì)象來(lái)表示瘤睹。