第 2 條:在類的頭文件中盡量少引入其他頭文件

常見引入一個類的方法(頭文件):

#import "EOCEmployer.h" //這樣可行,但不夠優雅。

在編譯一個使用了 EOCPerson 類的文件時,不需知道 EOCEmployer 類的全部細節,只需知道有一個類名為 EOCEmployer 就好。可以這樣寫:

@class EOCEmployer;

這叫做“向前聲明”(forward declaring)該類。

將引入頭文件的時機盡量延后,只在確有需要時才引入,這樣就可以減少類的使用者所需引入的頭文件數量。也解決了兩個類相互引用的問題。

若把 EOCEmployer.h 引入到 EOCPerson.h,則只要引入 EOCPerson.h, 就會一并引入 EOCEmployer.h 的所有內容。此過程若持續下去,則要引入許多根本用不到的內容,這當然會增加編譯時間。

如果在各自頭文件中引入對方的頭文件,則會導致“循環引用”(chicken-and-egg situation)。雖然使用 #import而非#include不會導致死循環,但兩個類其中一個無法正確編譯。

若一個類繼承自某個超類,則必須引入定義那個超類的頭文件。
同理,若要聲明一個類遵從某個協議(protocol),該協議必須有完整定義,且不能使用向前聲明(向前聲明只能告訴編譯器有某個協議,而此時編譯器卻要知道該協議中定義的方法)。

要點:

  • 除非有必要,否則不要引入頭文件。一般來說,應在某個類的 頭文件 中使用 向前聲明 來提及別的類,并在 實現文件引入 那些類的頭文件。這樣做可以盡量降低類之間的耦合(coupling)。
  • 無法使用向前聲明時,盡量把“該類遵循某協議”這條聲明移至“class-continuation”中,或單獨放到一個頭文件中再引入。

主要來源:《Effective Objective-C 2.0》

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容