編寫高質(zhì)量的iOS代碼(五)

使用清晰而協(xié)調(diào)的命名方式

  • 起名時應遵從標準的Objective-C命名規(guī)范,這樣創(chuàng)建出來的接口更容易為開發(fā)者所理解。

??:

NSString *text = @"The quick brown fox jumped over the lazy dog";
NSString *newText = [NSString stringByReplacingOccurrencesOfString:@"fox" with String:@"cat"];

雖然只是一個簡單的表達式,但是OC中卻用一整句話來表達,這樣做會讓方法更明確、易讀。并且方法與變量名使用了“駝峰式大小寫命名法”(camel casing)。類名也用駝峰命名法,不過首字母要大寫,通常還有兩三個前綴字母。
當然這只是一種習慣,不是硬性要求,也可以按照自己的風格來命名,不過用駝峰命名法更容易被其他Objective-C開發(fā)者所接受。

  • 方法名要言簡意賅,從左至右讀起來要像個日常用語中的句子才好。

不要吝于使用長方法名,把方法名起得稍微長一點,可以保證能準確的傳達出所執(zhí)行的任務。當然,方法名也不能長的過分。
NSString這個類就展示了一套良好的命名習慣,列舉出幾個方法:

  • + string
    工廠方法(factory method),用于創(chuàng)建新的字符串。方法名就清晰的描述了返回值的類型。
  • + stringWithString
    工廠方法,根據(jù)某個字符串創(chuàng)建出與之內(nèi)容相同的新字符串(感覺和copy一樣)。方法名第一個單詞也指明了返回類型。
  • + localizedStringWithFormat:
    工廠方法,根據(jù)特定格式創(chuàng)建出新的“本地化字符串”(locallized string)。返回值類型是第二個單詞(string),因為前面還有個修飾語(localized)用來描述其邏輯含義。
  • - lowercaseString
    把字符串的大寫字母轉(zhuǎn)為小寫。這個方法不會修改字符串本身,而是創(chuàng)建一個新的字符串,返回值類型是第二個單詞(string),前面是定語(lowercase)。
  • - intValue
    將字符串解析為int型。返回值是int。通常不會簡寫返回值的類型,比如string不簡寫為str,但是由于"Integer"的簡寫"int"本身就是類型名稱,所以這么做就合理了。只有一個詞的名字通常用來表示屬性,所以后面加上了"Value"。
  • - length
    獲取字符串長度。這個方法只有一個詞,實際上length也是NSString的一個屬性。
  • - lengthOfBytesUsingEncoding:
    若字符串是以給定的編碼格式(ASCII、UTF8、UTF16等)來編碼的,則返回其字符數(shù)組的長度。這個方法和上面的"length"類似,但是這個方法需要一個參數(shù),所以緊跟著描述類型的名詞(encoding)。
  • - getCharacters:range:
    獲取字符串中給定范圍內(nèi)的字符。其他語言里的獲取方法也許會以get開頭,但是Objective-C中一般不這么做,但是此處是個例外。原因在于,調(diào)用方法時要在其首個參數(shù)中傳入數(shù)組,而該方法所獲取的字符正是要放到這個數(shù)組里面。
  • - hasPrefix:
    判斷本字符串是否以另一個字符串開頭。因為返回值是Boolean類型,所以為了讀起來像個句子,這種方法的名稱中通常包括has(“是否有”)一詞。
  • - isEqualToString:
    判斷兩字符串是否相等。返回值是Boolean,為了便于述說,方法名用is開頭。

給方法命名時的注意事項可以總結(jié)成下面幾條規(guī)則:

  • 如果方法的返回值是新創(chuàng)建的,那么方法名的首個詞應該是返回值的類型,除非前面還有修飾語,例如上面的localizedString。需要注意,屬性的存取方法不遵循這種命名方式,因為一般認為這些方法不會創(chuàng)建新的對象。

  • 應該把表示參數(shù)類型的名詞放在簽署前面。

  • 如果方法要在當前對象上執(zhí)行操作,那么就應該包含動詞;若執(zhí)行操作時還需要參數(shù),則應該在動詞后面加上一個或多個名詞。

  • 不要使用str這種簡稱,應該用string這樣的全稱。

  • Boolean屬性應加is前綴。如果某方法返回非屬性的Boolean值,那么應該根據(jù)其功能,選用has或is當前綴。

  • 將get整個前綴留給那些借由“輸出參數(shù)”來保存返回值的方法,比如說,把返回值填充到“C語言數(shù)組”里的那種方法就可以使用整個次做前綴。

  • 給方法起名時的第一要務就是確保其風格與你自己的代碼所要繼承的框架相符。

  • 最重要的一點就是,命名方式要協(xié)調(diào)一致。如果要從其他框架中集成子類,那么務必遵循其命名慣例。

??:從UIView類中繼承自定義的子類,那么類名末尾的詞必須是View。同理,創(chuàng)建自己定義的delegate protocol,則其名稱中應該包含委托發(fā)起方的名稱,后面再跟上Delegate一詞。


為私有方法名加前綴

  • 這樣的做法可以很容易地將其同公共方法區(qū)分開。

編寫類的實現(xiàn)代碼的時候,經(jīng)常會寫一些只有在內(nèi)部才使用的方法。在私有方法前加前綴可以更好的調(diào)試。還有一個原因就是這么做便于修改方法名或方法簽名。不同于私有方法,類的公共API一般是不能夠隨意改動的。而私有方法有了前綴,就可以很容易的看出哪些可以隨意修改,哪些不能。

  • 不要單用一個下劃線做私有方法的前綴,因為這種做法是預留給蘋果公司用的。

具體用什么前綴根據(jù)自己的喜好來定,但是其中最好包含下劃線和字母p(private)。


理解Objective-C錯誤模型

  • 只有在發(fā)生了可使整個應用程序崩潰的嚴重錯誤時,才應使用異常。

首先要注意,“自動引用計數(shù)”(ARC)在默認的情況下不是“異常安全的”(exception safe)。具體點,如果拋出異常,本應該在作用域末尾釋放的對象現(xiàn)在卻不會自動釋放了。
OC語言現(xiàn)在采用的辦法就是:只在極其罕見的情況下拋出異常,異常拋出之后,無需考慮恢復問題,而且app此時也應該退出。

  • 在錯誤不那么嚴重的情況下,可以指派“委托方法”(delegate method)來處理錯誤,也可以把錯誤信息放在NSError對象里,經(jīng)由“輸出參數(shù)”返回給調(diào)用者。

NSError的用法更靈活,因為我們可以通過它來將錯誤信息報出來,NSError里封裝了三條信息:

  • Error domain(錯誤范圍,類型為字符串)
    ??,“處理URL的子系統(tǒng)”(URL-handling subsystem)在從URL中解析或取得數(shù)據(jù)時出錯,就會只用NSURLErrorDomain來表示錯誤范圍。
  • Error code(錯誤碼,類型為整數(shù))
    通常都是用枚舉來定義,常見的就是HTTP請求的錯誤碼。
  • User info(用戶信息,類型為字典)
    錯誤的額外信息,其中有可能包含一段“本地化描述”(localized description),也有可能包含的是另外一個錯誤,經(jīng)由此種信息,可以把相關的錯誤串成一條“錯誤鏈”(chain of errors)。

而NSError一種最常見的用法就是寫在delegate method中。

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

另一種常見的用法就是最為“輸出參數(shù)”返回給調(diào)用者。

 - (BOOL)doSomething:(NSError **)error;

理解NSCopying協(xié)議

  • 若想令自己所寫的對象具有拷貝功能,則需要實現(xiàn)NSCopying協(xié)議。

同時要實現(xiàn)NSCopying中唯一的一個方法:

 - (id)copyWithZone:(NSZone *)zone

之所以存在NSZone是因為,在之前的開發(fā)中,會將內(nèi)存分成不同的“區(qū)”(zone),但是對象只會創(chuàng)建在這個區(qū)里(allocWithZone)。但是現(xiàn)在不用了,每個程序只有一個區(qū):“默認區(qū)”(default zone),也就是說,上面方法中的參數(shù)可以不用擔心。

  • 如果自定義的對象分為可變版本和不可變版本,那么就要同時實現(xiàn)NSCopying與NSMutableCopying協(xié)議。
 - [NSMutableArray copy] => NSArray
 - [NSArray mutableCopy] => NSMutableArray
  • 復制對象時需決定采用淺拷貝還是深拷貝,一般情況下應該盡量執(zhí)行淺拷貝。


    淺拷貝與深拷貝對比圖。淺拷貝之后的內(nèi)容與原始內(nèi)容均指向相同對象。而深拷貝之后的內(nèi)容所指的對象是原始內(nèi)容中相關對象的一份拷貝。
  • 如果你所寫的對象需要深拷貝,那么可考慮新增一個專門執(zhí)行深拷貝的方法。

因為沒有專門定義深拷貝的協(xié)議,所以具體執(zhí)行的方式是每個類自己來確定的。在絕大多數(shù)的情況下,NSCopying執(zhí)行的都是淺拷貝,除非該類的文檔中說明了它是用深拷貝的,否則就尋找能夠執(zhí)行深拷貝的相關方法,或者自己編寫方法來做。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容