命名規(guī)則 - Conventions

2018-08-12 21:19 更新

命名規(guī)則 - Conventions

使用框架類時,你會發(fā)現(xiàn) Objective-C 代碼非常易于閱讀。它的類名和方法名比一般的 C 語言函數(shù)或 C 標準庫要更加具有描述性。Camel Case 適用于帶有多個單詞的名稱。在編寫類的時候,你應當使用與 Cocoa 和 Cocoa Touch 相同的規(guī)則,這樣可以使你的代碼對于你和其他需要與你協(xié)同工作的 Objective-C 開發(fā)者來說更加易讀,并且可以保證代碼庫的一致性。

此外,請嚴格遵循命名規(guī)則,保證 Objective-C 框架功能的各種機制的正常工作。例如,訪問方法的名稱必須遵循命名規(guī)則來命名才能在 Key-Value Coding(KVC)或 Key-Value Observing(KVO)機制下正常工作。

本章介紹了一些廣泛運用于 Cocoa 及 Cocoa Touch 編碼中的命名規(guī)則,也列舉了需要在整個應用程序項目(包括使用到的框架類)中唯一命名的情況。

一些名稱必須在程序中唯一

創(chuàng)建一個新的類別、符號或是標識符時,你必須先考慮它的名稱在所屬區(qū)域中是否唯一。這個區(qū)域可能是整個應用程序(包括所涉及到的框架類);也有可能僅僅是一個封裝的類或是一個代碼塊。

類名應在程序中唯一

不論是在項目中還是在項目所包含的框架或 bundle 中,Objective-C 中的類名必須是唯一的。例如,避免使用如 ViewController 或 TextParser 作為類名,因為這些名稱有可能是包含在 App 中的一個框架名。

在命名類時使用前綴命名可以保證類名唯一。你會注意到 Cocoa 及 Cocoa Touch 的類名通常都以 NS 或 UI開頭。像這樣兩個字符組成前綴的命名方式在 Apple 中專門為框架類而保留。隨著你學習更多關于 Cocoa 及 Cocoa Touch 的知識,你會遇到一些其他的特定框架的前綴,如下表所示。

Prefix Framework
NS Foundation (OS X and iOS) and Application Kit (OS X)
UI UIKit (iOS)
AB Address Book
CA Core Animation
CI Core Image

而你所創(chuàng)建的類的命名必須使用三個字符組成的前綴,可以是你的公司名和 App 名的結(jié)合,也可以是你的 App 中的某個組成部分。例如,如果你的公司叫做 Whispering Oak,你正在開發(fā)的一個游戲叫做 Zebra Surprise,那么你可以使用 WZS 或 WOZ 作為類名的前綴。

此外,你應該盡可能使用名詞來命名你的類名,這樣可以明確地顯示這個類所代表的含義。例如下表中來自 Cocoa 及 Cocoa Touch中的例子。

NSWindow CAAnimation: NSWindowController NSManagedObjectContext

如果你需要使用多個單詞來命名你的類,那么每個單詞的首字母必須是大寫。

類中的方法名應具描述性且唯一

在保證了類名唯一后,同時這個類中所定義的方法名也必須是唯一的,但它可以與其他類中的某一個方法名相同。例如復寫一個父類方法或是使用多態(tài)方法的情況。在不同類中具有相同功能的方法應當有相同的方法名、返回類型和參數(shù)類型。

方法名不需要包含前綴,且應當以小寫字母開頭,而對于多單詞組成的名稱,后續(xù)單詞的首字母應該大寫。下表為 NSString 類中的方法的命名。

length characterAtIndex: lengthOfBytesUsingEncoding:

如果一個方法中帶有多個參數(shù),那么方法名中必須提示每一個參數(shù):

substringFromIndex: writeToURL:atomically:encoding:error: enumerateSubstringsInRange:options:usingBlock:

方法名的第一部分提示方法的主要作用或提示方法調(diào)用后的結(jié)果。例如,如果一個方法在調(diào)用后返回一個值,那么第一個單詞應當表明該返回值的類型,如上文表格中的方法名 length,character...,substring...等等;如果你還需要在方法名中提示一些關于這個返回值的信息,那么應當使用多個單詞來命名方法,如 NSString 類中的 mutableCopy 方法,capitalizedString 方法和 lastPathComponent 方法;如果一個方法用于執(zhí)行某個操作,如寫磁盤或列舉目錄,那么方法名的第一個單詞必須提示這個操作,如 write... 方法或 enumerate... 方法。

如果方法中含有一個 error 指針參數(shù)來指示錯誤,那么應在其名稱的最后加上 error 參數(shù);如果方法中使用了 block,同樣,為了使得能夠應在方法名的最后加上 blcok 參數(shù)。

使用一個能夠清楚表明方法的作用但又簡潔明了的方法名非常重要,這不代表你需要取一個冗長的方法名,而同時方法名過于簡潔明了也無法很好地表明一個方法的含義,因此最佳的方法是在這二者中找尋平衡點,如:

stringAfterFindingAndReplacingAllOccurrencesOfThisString:withThisString Too verbose
strReplacingStr:str: Too concise
stringByReplacingOccurrencesOfString:withString: Just right

除非在不同語言和文化中某個單詞的縮寫是眾所周知的,否則你應當避免在方法名中使用縮寫。這里提供了一個常見縮寫的列表:Acceptable Abbreviations and Acronyms

在框架類的 Categories 中使用前綴命名方法

當使用 Category 來創(chuàng)建方法到一個已經(jīng)存在的框架類時,你需要在方法名中使用前綴來避免沖突。

同一區(qū)域內(nèi)局部變量名必須唯一

由于 Objective-C 是 C 語言擴展而來,因此 Objective-C 同樣要遵守 C 語言中的變量命名規(guī)則。一個局部變量的變量名不允許與在相同范圍內(nèi)聲明的其他變量名沖突。

(void)someMethod {
    int interestingNumber = 42;
    ...
    int interestingNumber = 44; // not allowed
}

盡管 C 語言允許一個局部變量的變量名與封裝區(qū)域中的變量名相同。如下:

(void)someMethod {
    int interestingNumber = 42;
    ...
    for (NSNumber *eachNumber in array) {
        int interestingNumber = [eachNumber intValue]; // not advisable
        ...
    }
}

但這樣會使得代碼段變得混亂,不易于閱讀,所以在編碼中請盡量避免這種情況。

方法名

與類的命名相同,除了考慮唯一性之外,方法的命名還應該遵循嚴格的命名規(guī)則。除了 Cocoa 和 Cocoa Touch 的要求外,這些規(guī)則是為了滿足一些 Objective-C 的基礎機制,如編譯和運行。

訪問方法的名稱

使用 @property 語法來聲明對象的屬性時(如 Encapsulating Data),編譯器會自動合成 getter 和 setter 方法。如果你需要使用自己提供的訪問方法,那么你需要保證一個每一個屬性都使用了正確的方法名,這樣方法才可以被語法點調(diào)用。

除個別特殊情況之外,一個 getter 方法必須使用與屬性相同的名稱。例如,一個屬性名為 firstname,那么它的訪問方法名稱也應為 firstname。但 Boolean 屬性是一個特例,因為 Boolean 屬性的 getter 方法名以 is 開頭。例如,一個屬性名為 paused,那么它的 getter 方法名為 isPaused。

一個屬性的 setter 方法命名應使用形如 setPropertyName: 的形式。譬如,一個屬性名為 firstname,那么它的 setter 方法應為 setFirstName:;同樣對于一個 Boolean 型的屬性 paused 而言,相應的 setter 方法應為 setPaused:。

盡管使用 @property 語法能夠方便地設定不同的訪問方法名稱(你只需要特殊考慮 Boolean 型的情況),但你還是需要注意下述的一些規(guī)則,以免如 Key Value Coding(getter 名為 valueForKey:,setter名為 setValue:forKey:) 這樣的機制無法正常工作。了解更多有關 KVC 的信息,查閱 Key-Value Coding Programming Guide 。

創(chuàng)建對象的方法名

在之前的一些章節(jié)中介紹了許多不同創(chuàng)建一個類的實例的方法,你可以同時分配空間和初始化,例如:

NSMutableArray *array = [[NSMutableArray alloc] init];

或者你可以使用 new 方法來分配空間和初始化:

NSMutableArray *array = [NSMutableArray new];

一些類還提供了 class factory 方法:

NSMutableArray *array = [NSMutableArray array];

創(chuàng)建 class facotry 方法應以其所創(chuàng)建的類的名稱開頭(不使用前綴),以 NSArray 類為例,它的 factory 方法以 array 開頭。而 NSMutableArray 類不定義任何它的類依賴 factory 方法,因此它創(chuàng)建一個可變 array 的 factory 方法仍然以 array 開頭。

Objective-C 有許多不同的內(nèi)存管理規(guī)則,這些規(guī)則讓編譯器能夠保證對象有足夠的的內(nèi)存空間。編譯器會根據(jù)創(chuàng)建方法的名稱來判斷遵循哪一條規(guī)則。因為 autorelease pool blocks 不同,由 factory 方法創(chuàng)建的對象與由傳統(tǒng)的分配空間、初始化或 new 方法得來的對象在管理上會有細微的區(qū)別。學習更多有關 autorelease pool blocks 和一般的內(nèi)存管理知識,查閱 Advanced Memory Management Programming Guide 。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號