開小差:最近發現自己有一個經驗主義的毛病,不太容易接受新的知識,這對從事技術研發的人來說不太合理,需要改之。
正文:通過讀寫大量代碼我有自己的一套編程思路和習慣,自認為自己的編碼習慣還是不錯的,代碼結構也算清晰,因為我一直以來都是代碼看的多寫的多,但是總結的比較少,知識經常不成體系。以后多花點時間把自己的經驗和學習知識加以總結一下吧,這樣有利於去指導新人,也更有利於加深自己的知識認知。今天就從代碼規范入手總結一下iOS開發中好的編碼規范吧。我們在開發中看別人的代碼的時候經常會去抱怨至少內心里罵娘,其實別人看你的代碼也許也在抱怨你,我更深刻的意識到:高手和新手有代碼規范水平的差異,高手與高手之間有變成思想的差異,新手之間就在模仿中就更加凌亂了。因此團隊開發一定要有很好的且統一的編碼規范,這樣才有利於團隊開發與快速維護。今天先寫第一篇:《iOS開發(OC)中的命名規范》
命名原則
1.一般性原則:可讀性高(簡潔且清晰)和防止命名沖突(通過加前綴來保證)。
Objective-C 的命名通常都比較長, 名稱遵循駝峰式命名法. 一個好的命名標准很簡單, 就是做到在開發者一看到名字時, 就能夠懂得它的含義和使用方法. 另外, 每個模塊都要加上自己的前綴, 前綴在編程接口中非常重要, 可以區分軟件的功能范疇並防止不同文件或者類之間命名發生沖突, 比如相冊模塊(PhotoGallery)的代碼都以PG作為前綴: PGAlbumViewController, PGDataManager.
代碼 |
點評 |
insertObject:atIndex: |
Good |
insert:at: |
不清晰;要插⼊什么?“at”表⽰示什么? |
removeObjectAtIndex: |
Good |
removeObject: |
不錯,因為⽅法是⽤用來移除作為參數的對象 |
remove: |
不清晰;要移除什么? |
2.一致性
盡可能與Cocoa
編程接⼝命名保持一致。如果你不太確定某個命名的⼀致性,請瀏覽頭文件或參考文檔中的范例,在使⽤多態方法的類中,命名的⼀致性⾮常重要。在不同類中實現相同功能的⽅法應該具有同的名稱。
代碼 | 點評 |
---|---|
– (NSInteger)tag | 在 NSView, NSCell, NSControl 中有定義 |
– (void)setStringValue:(NSString *) | 在許多 Cocoa classes 中都有定義 |
文件的命名
文件的擴展名應該如下:
.h |
C/C++/Objective-C 的頭文件 |
.m |
Ojbective-C 實現文件 |
.mm |
Ojbective-C++ 的實現文件 |
.cc |
純 C++ 的實現文件 |
.c |
純 C 的實現文件 |
類別的文件名應該包含被擴展的類名,如:GTMNSString+Utils.h
或``GTMNSTextView+Autocomplete.h``。
類的命名
類名(以及類別、協議名)應首字母大寫,並以駝峰格式分割單詞。
1.類的前綴
1)所有類名、枚舉、結構、protocol定義時最好加一個統一的標示符,可以是項目縮寫,或者個人項目的名稱縮寫,例如都加上全大寫的Hoo(我的姓氏)作為前綴
2)根據功能模塊可以在給功能模塊的類添加功能模塊的名稱前綴,如用戶中心的profileViewController.可以命名為HooUCProfileViewController.
2.類的后綴
所有protocol定義時,都加上后綴Delegate 。如,HooRefreshViewDelegate,表示RefreshView的協議;
所有的控制器都加上Controller,所有的通知名都加上Notification。
類別命名
類名+標識+擴展(UIImageView +HP+Web)
例:如果我們想要創建一個基於UIImageView 的類別用於網絡請求圖片,我們應該把類別放到名字是UIImageView+HPWeb.h的文件里。UIImageView為要擴展的類名,HP為專屬標識,Web為擴展的功能。
方法命名
方法名應遵守小駝峰原則,首字母小寫,其他單詞首字母大寫,每個空格分割的名稱以動詞開頭。執行性的方法應該以動詞開頭,小寫字母開頭,返回性的方法應該以返回的內容開頭,但之前不要加get。
如:
- (void)insertModel:(id)model atIndex:(NSUInteger)atIndex; - (instancetype)arrayWithArray:(NSArray *)array;
枚舉的命名
正宗的iOS開發者當然要以Objective-C的方式命名枚舉,如:
typedef NS_ENUM(NSInteger, UIViewAnimationTransition) { UIViewAnimationTransitionNone, UIViewAnimationTransitionFlipFromLeft, UIViewAnimationTransitionFlipFromRight, UIViewAnimationTransitionCurlUp, UIViewAnimationTransitionCurlDown, };
屬性、變量命名
變量名使用小駝峰法, 使變量名盡量可以推測其用途屬性具有描述性。別一心想着少打幾個字母,讓你的代碼可以迅速被理解更加重要。每個屬性命名都加上類型后綴,如,按鈕就加上Button
后綴,模型就加上Model
后綴。
@property (nonatomic, strong) UIButton *submitButton;
1)類成員變量名
成員變量用小駝峰法命名並前綴下划線,如:UIButton *_submitButton;
2)局部變量名
遵守小駝峰命名規則,如:NSInteger numCompletedConnections =3;
const常量
以小寫k
開頭,后面單詞首字母大寫,其余小寫。如:
const float kMaxHeigt = 100.0f;
如果是特殊含義的常量也建議加上后綴,如通知加上Notification為后綴,如:
extern Nsstring * Const kLoginSuccessNotification
資源文件命名 (圖片,本地化文件)
這個圖片資源命名方式,以功能為組織形式,是一個很好的習慣,有利於查看資源文件。
原則:
1)采用單詞全拼,或者大家公認無岐義的縮寫(比如:nav,bg,btn等)
2)采用“模塊+功能”命名法,模塊分為公共模塊、私有模塊。公共模塊主要包括統一的背景,導航條,標簽,公共的按鈕背景,公共的默認圖等等;私有模塊主要根據app的業務功能模塊划分,比如用戶中心,消息中心等。
例如用戶中心用戶頭像圖片的命名可以為:uc_imageview_user_icon