為什么要有編碼規(guī)范這么一說呢伴网?你設(shè)想一下如果張三寫代碼一個風格茁计,李四一個風格怀骤,當張三去看李四的時候他會極度的不舒服击敌,反過來李四去看張三的代碼的時候也會感覺非常的糟糕。所以他們兩個人遵循同一個規(guī)則的時候拴事,再去看對方的代碼的時候就不會不適應(yīng)沃斤,因此指定一個大家都遵循的代碼編程風格就至關(guān)重要了。對于iOS開發(fā)刃宵,蘋果官方就制定了一套編碼規(guī)范衡瓶。作為iOS開發(fā)者遵循蘋果制定的編碼規(guī)范寫代碼,那么在看蘋果的官方代碼的時候就覺得很輕松了牲证。
命名
這點非常重要O搿!坦袍!沒有重復三遍十厢,但是依然是最重要的!N嫫搿蛮放!如果你不是一開始就跟著項目走而是在中途或者是需要你維護一個別人留下的項目的時候。如果項目是經(jīng)過幾手奠宜,而且沒有統(tǒng)一的命名風格包颁,而且還沒有注釋。這時候你面對項目压真,你的內(nèi)心是崩潰的娩嚼。如果可以把寫這些代碼的揪出來,我保證你會把他打的不像人樣滴肿!好的命名勝過N多的注釋岳悟!
命名的一般性原則
清晰性
- 要清晰且簡短,但是要注意不要因為簡短放棄簡短泼差,清晰是首位竿音。
- 名稱通常不縮寫,即使名稱很長也要拼寫完全拴驮。(你有可能比較討厭蘋果那長長的方法名春瞬,但是你看到方法就知道是干嘛的,連文檔都省了套啤,因此OC也有自文檔語言的美譽)宽气。
- 避免有歧義的命名随常。歧義是一個造成誤會的罪魁禍首。
一致性
代碼命名的一致性能帶給閱讀代碼者非常的閱讀體驗萄涯,能讓人一眼就看出這大概是什么绪氛。
- 盡可能使用與Cocoa編程接口命名保持一致的名稱。如果你不太確定某個命名的一致性,請瀏覽一下頭文件或參考文檔中的范例涝影。
- 在使用多態(tài)方法的類中,命名的一致性非常重要枣察。在不同類中實現(xiàn)相同功能的方法應(yīng)該具有相同的名稱。
不要自我指涉
自我指涉的英文是:self-reference,如果你不明白什么是自我指涉燃逻,給你講個故事吧序目。從前有座山,山上有座廟伯襟,廟里有個和尚猿涨,和尚說,從前有座山……
- 首先名稱不要自我指涉姆怪,看下面的代碼叛赚。
NSString //okey
NSStringObject //自我指涉
- 掩碼(可使用位操作進行組合)和用作通知名稱的常量不受該約定限制。
前綴
前綴不僅可以防止和蘋果的命名發(fā)生沖突稽揭,而且也可以區(qū)分軟件的功能范圍俺附,比如UIKit里面的都以UI開頭,看到UI開頭的類我們就能知道是UI相關(guān)的溪掀。
- 前綴有規(guī)定的格式昙读。它由兩到三個大寫字符組成,不能使用下劃線與子前綴。
- 命名class,protocol,structure,函數(shù),常量時使用前綴;命名成員方法時不使用前綴,因為方法已經(jīng)在它所在類的命名空間種;同理,命名結(jié)構(gòu)體字段時也不使用前綴膨桥。
書寫約定
書寫約定能規(guī)范命名蛮浑,不然你會看到其他語言的影子,比如以前寫C++的你就會發(fā)現(xiàn)他會帶一股濃濃的C++味道只嚣。OC也應(yīng)該有OC的味道沮稚。來看看OC對于書寫有哪些約定吧!
- 對于包含多個單詞的名稱,不要使用標點符號作為名稱的一部分或作為分隔符(下劃線,破折號等)册舞。大寫每個單詞的首字符并將這些單詞連續(xù)拼寫在一起蕴掏。并且要注意一下限制:
- 方法名小寫第一個單詞的首字符,大寫后續(xù)所有單詞的首字符。方法名不使用前綴调鲸。
- 函數(shù)名和常量名使用與其關(guān)聯(lián)類相同的前綴,并且要大寫前綴后面所有單詞的首字符盛杰。
- 避免使用下劃線來表示名稱的私有屬性。蘋果公司保留該方式的使用藐石。如果第三方這樣使用可能 會導致命名沖突,他們可能會在無意中用自己的方法覆蓋掉已有的私有方法,這會導致嚴重的后 果即供。(蘋果是不建議用私有變量的,這一點在用runtime解決一些問題的時候常常用到于微,因此得注意逗嫡。在命名的時候不要把其他語言的習慣帶到OC中)?青自。
類與協(xié)議命名要注意的事兒
- 類名應(yīng)包含一個明確??述該類(或類的對象)是什么或做什么的名詞。類名要有合適的前綴驱证。
- 協(xié)議應(yīng)該根據(jù)對方法的行為分組方式來命名延窜。
關(guān)于頭文件
- 聲明孤立的類或協(xié)議:將孤立的類或協(xié)議聲明放置在單獨的頭文件中,該頭文件名稱與類或協(xié)議同名。
- 聲明相關(guān)聯(lián)的類或協(xié)議:將相關(guān)聯(lián)的聲明(類,類別及協(xié)議) 放置在一個頭文件中,該頭文件名稱與 主要的類/類別/協(xié)議的名字相同抹锄。
- 包含框架頭文件:每個框架應(yīng)該包含一個與框架同名的頭文件,該頭文件包含該框架所有公開的頭文 件逆瑞。(寫一個庫的時候一般得這么干,你去看看蘋果的庫或者出名的苦伙单,里面有一個和庫同名的頭文件获高,里面全是其他頭文件的引用)。
- 為已有框架中的某個類擴展 API:如果要在一個框架中聲明屬于另一個框架某個類的范疇類的方法, 該頭文件的命名形式為:原類名+“Additions”车份。
- 相關(guān)聯(lián)的函數(shù)與數(shù)據(jù)類型:將相聯(lián)的函數(shù),常量,結(jié)構(gòu)體以及其他數(shù)據(jù)類型放置到一個頭文件中,并
以合適的名字命名谋减。
關(guān)于方法命名
除了上述要注意的牡彻,還有一些小的問題也需要注意扫沼。
- 表示對象行為的方法,名稱以動詞開頭。
- 名稱中不要出現(xiàn) do 或 does,因為這些助動詞沒什么實際意義庄吼。也不要在動詞前使用副詞或形容詞修飾缎除。
- 如果方法返回方法接收者的某個屬性,直接用屬性名稱命名。不要使用 get,除非是間接返回一個或 多個值总寻。
- 參數(shù)要用??述該參數(shù)的關(guān)鍵字命名器罐。
- 參數(shù)前面的單詞要能??述該參數(shù)。
- 不要使用and來連接用屬性作參數(shù)關(guān)鍵字渐行。一般不用and,除非滿足下面這條轰坊。
- 如果方法??述兩種獨立的行為,使用and來串接它們。
關(guān)于訪問方法
訪問方法就是我們常說的setter和getter方法祟印。那么在寫(或重寫)訪問方法的時候要注意些什么呢肴沫?
- 如果屬性是用名詞??述的,則命名格式為:
- (void) setNoun:(type)aNoun;
- (type) noun;
- 如果屬性是用形容詞??述的,則命名格式為:
- (void) setAdjective:(BOOL)flag;
- (BOOL) isAdjective;
- 如果屬性是用動詞??述的,則命名格式為:(動詞要用現(xiàn)在時時態(tài))
- (void) setVerbObject:(BOOL)flag;
- (BOOL) verbObject;
- 不要使用動詞的過去分詞形式作形容詞使用.
- 可以使用情態(tài)動詞(can,should,will等)來??高清晰性,但不要使用do或does.
- 只有在方法需要間接返回多個值的情況下,才使用get.
關(guān)于委托方法
在開發(fā)中會經(jīng)常用到代理設(shè)計模式,但是代理方法也是有一定的命名規(guī)則的蕴忆。委托方法的這些規(guī)則也使用于
- 名稱以標示發(fā)送消息的對象的類名開頭,省略類名的前綴并小寫類第一個字符颤芬。經(jīng)常用的tabview的代理方法或者數(shù)據(jù)源方法都是tabview開頭的。
- 冒號緊跟在類名之后(隨后的那個參數(shù)表示委派的對象)套鹅。該規(guī)則不適用于只有一個 sender 參數(shù)的 方法站蝠。
- 面的那條規(guī)則也不適用于響應(yīng)通知的方法。在這種情況下,方法的唯一參數(shù)表示通知對象卓鹿。
- (void) windowDidChangeScreen:(NSNotification *)notification;
- 用于通知委托對象操作即將發(fā)生或已經(jīng)發(fā)生的方法名中要使用did或will.
- 用于詢問委托對象可否執(zhí)行某操作的方法名中可使用did或will,但最好使用should.
關(guān)于集合方法
集合方法命名有如下一些限制和約定
- 如果集合中的元素無序,返回 NSSet,而不是 NSArray菱魔。
- 如果將元素插入指定位置的功能很重要,則需具備如下方法:
- (void) insertElement:(elementType)anObj atIndex:(int)index;
- (void) removeElementAtIndex:(int)index;
集合方法的實現(xiàn)要考慮如下細節(jié):
- 集合類方法通常負責管理元素的所有者關(guān)系,在 add 或 insert 的實現(xiàn)代碼里會 retain 元素,在 remove 的實現(xiàn)代碼中會 release 元素.
- 當被插入的對象需要持有指向集合對象的指針時,通常使用 set... 來命名其設(shè)置該指針的方法,且不 要 retain 集合對象。
關(guān)于方法的參數(shù)
- 第一條是最基本的吟孙,參數(shù)小寫第一個單詞首字母豌习,大寫后面單詞的首字母存谎。
- 不要在參數(shù)名中使用 pointer 或 ptr,讓參數(shù)的類型來說明它是指針。
- 避免使用 one, two,...,作為參數(shù)名肥隆。這樣的參數(shù)都不好意思用既荚,鬼知道這代表什么。
- 盡量不要縮寫栋艳,多寫幾個字母又不會死人恰聘。
關(guān)于私有方法
- 不要使用下劃線表示自己私有方法名稱的前綴,Apple保留了這種做法吸占。
- 若要繼承 Cocoa framework 中一個超大的類(如:NSView),并且想要使你的私有方法名稱與基類 中的區(qū)別開來,你可以為你的私有方法名稱添加你自己的前綴晴叨。這個前綴應(yīng)該具有唯一性,如基于你 公司的名稱,或工程的名稱,并以“XX_”形式給出。比如你的工程名為"Byte Flogger",那么就可以是 “BF_addObject:”矾屯。這一點在我的博文分析別人的開源庫的時候就發(fā)現(xiàn)就有人這么做兼蕊。
關(guān)于函數(shù)的命名
在OC中是可以使用C函數(shù)的,所以這里的函數(shù)指的是C函數(shù)件蚕。
- 函數(shù)命名與方法命名相似,但有兩點不同:
- 它們有前綴,其前綴與你使用的類和常量的前綴相同
- 大寫前綴后緊跟的第一個單詞首字符
- 大多數(shù)函數(shù)名稱以動詞開頭,這個動詞??述該函數(shù)的行為孙技。
實例變量與數(shù)據(jù)類型的命名
實例變量
在為類添加實例變量的時候需要注意以下幾點:
- 避免創(chuàng)建public變量
- 使用@private,@protected顯式限定實例變量的訪問權(quán)限
- 確保實例變量名簡明扼要地??述了它所代表的屬性
- 如果實例變量被設(shè)計為可被訪問的,確保編寫了訪問方法
枚舉常量
- 使用枚舉來定義一組相關(guān)的整數(shù)常量
- 枚舉常量與其typedef遵守函數(shù)命名規(guī)則
- 位掩碼常量可以使用不具名枚舉
其他常量
- 通常不使用 #define來創(chuàng)建常量。如上面所述,整數(shù)常量請使用枚舉,浮點數(shù)常量請使用const
- 使用大寫字母來定義預(yù)處理編譯宏排作。如:#ifdef DEBUG
- 編譯器定義的宏名首尾都有雙下劃線牵啦。如:MACH
- 為 notification 名及 dictionary key 定義字符串常量,從而能夠利用編譯器的拼寫檢查,減少書寫錯誤
通知
- 如果一個類有委托,那它的大部分通知可能由其委托的委托方法來處理。這些通知的名稱應(yīng)該能夠反應(yīng)其 響應(yīng)的委托方法妄痪。比如,當應(yīng)用程序??交 NSApplicationDidBecomeActiveNotification 通知時,全局 NSApplication 對象的委托會注冊從而能夠接收 applicaitonDidBecomeActive: 消息哈雏。
通知由具有如下形式的全局 NSString 對象標識:
[相關(guān)聯(lián)類的名稱] + [Did 或 Will] + [UniquePartOfName] + Notification
NSApplicationDidBecomeActiveNotification
NSWindowDidMiniaturizeNotification
NSTextViewDidChangeSelectionNotification
NSColorPanelColorDidChangeNotification
開發(fā)中的一些小貼士
在initialize
類方法中,能夠編寫實現(xiàn)一些延遲執(zhí)行且只被一次的代碼,initialize
類方法是由運行時系統(tǒng)在該類響應(yīng)任何其他消息之前調(diào)用的。典型的應(yīng)用是在其中設(shè)置類的版本信息衫生。運行時系統(tǒng)向每個類發(fā)送initialize
消息,即使該類沒有實現(xiàn)initialize
,也會調(diào)用其基類的某個initialize
方法裳瘪。因此一個類的initialize
方法可能會因為存在繼承類的緣故被執(zhí)行多次。因此有必要使用一定的技巧來防止只執(zhí)行一次的代碼被多次執(zhí)行罪针。如:NSFoo
類的initialize
方法實現(xiàn)可能如下:
+ (id) initialize{
if (self == [NSFoo class]){
//初始化代碼
}
return self;
}
要注意不應(yīng)當顯式調(diào)用initialize方法彭羹。如果你需要激活initialize方法,使用[NSFoo self]形式的調(diào)用。
小結(jié)
習慣是平時一點點養(yǎng)成的站故,只要堅持就會有好的習慣皆怕。