編寫高質量iOS與OS X代碼的52個有效方法 - 學習筆記 三、4



第三章   接口與 API 設計

1五、用前綴避免命名空間衝突

Objective-C 沒有其餘語言那種內置的命名空間(namespace)機制。因此,咱們在起名時要設法避免潛在的命名衝突。
Apple 宣稱其保留使用全部「兩字母前綴」的權利
  • 選擇與你的公司、應用程序或兩者皆有關聯之名之稱做爲類名的前綴,並在全部代碼中均使用這一前綴。
  • 若本身所開發的程序中用到了第三方庫,則應爲其中的名稱加上前綴。


1六、提供「全能初始化方法」

每一個子類的全能初始化方法都應該調用其超類對應方法,並逐層向上。
  • 在類中提供一個全能初始化方法,並與文檔裏指明。其餘初始化方法均應調用此方法。
  • 若全能初始化方法與超類不一樣,則需覆寫超類中的對應方法。
  • 若是超類的初始化方法不適用於子類,那麼應該覆寫這個超類方法,並在其中拋出異常。


1七、實現 descripition 方法

  • 實現 description 方法返回一個有意義的字符串,用以描述該實例。
  • 若想在調試時打印出更詳盡的對象描述信息,則應實現 debugDescription 方法。


1八、儘可能使用不可變對象

設計類的時候,應充分運用屬性來封裝數據。而在使用屬性時,則可將其聲明爲「只讀」(read-only),建議你們儘可能減小對象中的可變內容
  • 儘可能建立不可變的對象
  • 若某屬性僅可於對象內部修改,則在分類中將其由 readonly 屬性擴展爲 readwrite 屬性。
  • 不要把可變的 collection 做爲屬性公開,應提供相關方法,以此修改對象中的可變  collection。


1九、使用清晰而協調的命名方式

Objective-C的命名方式雖然長一點,但卻很是清晰。
  • 起名時應聽從標準的OC命名規範,這樣建立出來的接口更容易爲開發者所理解。
  • 方法要言簡意賅,從左至右讀起來要像個平常用語中的句子。
  • 方法名裏不要使用縮略後的類型名稱。
  • 方法起名第一要務是確保風格與項目或所要集成的框架相符。


20、爲私有方法名加前綴

爲私有方法加前綴目的是爲了與公共方法區分開。還有個緣由就是便於修改方法名或方法簽名。
  • 給私有方法的名稱加上前綴便於與公共方法區分開。
  • 不要單用一個下劃線作私有方法的前綴,由於這種作法是預留給蘋果公司用的。


2一、理解 Objective-C 錯誤類型

OC語言針對異常的作法:只在極其罕見的狀況下拋出異常,異常拋出以後,無須考慮恢復問題,並且應用程序此時也應該退出。這就是說,不用再編寫複雜的「異常安全」代碼了。
  • 只有發生了可以使整個應用程序崩潰的嚴重錯誤時,才應使用異常。
  • 在錯誤不那麼嚴重的狀況下,能夠指派「委託方法」(delegate method)來處理錯誤,也能夠把錯誤信息放在 NSError 對象裏,經由「輸出參數」返回給調用者。


2二、理解 NSCopying 協議

若是想令本身的類支持拷貝操做,那就要實現 NSCopying 協議,該協議只有一個方法:緩存

- (id)copyWithZone:(NSZone *)zone;安全

  • 若想令本身所寫的對象具備拷貝功能,則需實現 NSCopying 協議。
  • 若是自定義的對象分爲可變版本與不可變版本,那麼就要同時實現 NSCopying 與 NSMutableCopying 協議。
  • 複製對象時需決定採用淺拷貝仍是深拷貝,通常狀況下應該儘可能執行淺拷貝。
  • 若是你所寫的對象須要深拷貝,那麼可考慮新增一個專門執行深拷貝的方法。



第四章 協議與分類

2三、經過委託與數據源協議進行對象間通訊

  • 委託模式爲對象提供了一套接口,使其可由此將相關事件告知其餘對象。
  • 將委託對象應該支持的接口定義成協議,在協議中把可能須要處理的事件定義成方法。
  • 當某個對象須要從另外一個對象中獲取數據時,可使用委託模式。這種狀況下,該模式亦稱「數據源協議」。
  • 如有必要,可實現含有位段的結構體,將委託對象是否能響應相關協議方法這一信息緩存至其中。


2四、將類的實現代碼分散到便於管理的數個分類之中

  • 使用分類機制把類的實現代碼劃分爲易於管理的小塊。
  • 將應該視爲「私有」的方法納入名叫 Private 的分類中,以隱藏實現細節。


2五、老是爲第三方類的分類名稱加前綴

  • 向第三方類中添加分類時,總應給其名稱加上你專用的前綴。
  • 向第三方類中添加分類時,總應給其中的方法名加上你專用的前綴。


2六、勿在分類中聲明屬性

  • 把封裝數據全部的所有屬性都定義在主接口裏。
  • 在 「class-continuation 分類」 以外的其它分類中,能夠定義存取方法,但儘可能不要定義屬性。


2七、使用 「class-continuation 分類」 隱藏實現細節

「class-continuation 分類」 和普通的分類不一樣,它必須定義在其所接續的那個類的實現文件裏。其重要以外在於,這是惟一能聲明實例變量的分類,並且此分類沒有特定的實現文件,其中的方法都應該定義在類的主實現文件裏。與其餘分類不一樣,該分類沒有名字。
  • 經過 「class-continuation 分類」 向類中新增實例變量。
  • 若是某屬性在主接口中聲明爲 「只讀」,而類的內部又要用設置方法修改此屬性,那麼就在 「class-continuation 分類」 中將其擴展爲 「可讀寫」。
  • 把私有方法的原型聲明在 「class-continuation 分類」 裏面。
  • 若想使類所遵循的協議不爲人所知,則可於 「class-continuation 分類」 中聲明。


2八、經過協議提供匿名對象

  • 協議可在某種程度上提供匿名類型。具體的對象類型能夠淡化稱聽從某個協議的 id 類型,協議裏規定了對象所實現的方法。
  • 使用匿名對象來隱藏類型名稱(或類名)。
  • 若是具體類型不重要,重要的是對象可以響應協議方法,那麼可以使用匿名對象來表示。
相關文章
相關標籤/搜索