iOS開發(fā)規(guī)范
引子
在看下面之前,大家自我檢測(cè)一下自己寫的代碼是否規(guī)范,代碼風(fēng)格是否過于迥異閱讀困難胸完?可以相互閱讀同伴的代碼,是否存在閱讀障礙翘贮?
若存在晦澀難懂的赊窥,理解成本增大的代碼,說明你的團(tuán)隊(duì)需要自省了狸页。
下面總結(jié)一下OC編程中的一些代碼規(guī)范(蘋果官方推薦的)锨能。以O(shè)C為示例,但不局限于OC芍耘,也可以被當(dāng)作別的編程語(yǔ)言的開發(fā)規(guī)范約定(僅需要把OC特有的東西按照你所使用的語(yǔ)言的慣例即可)
參考資料:蘋果代碼規(guī)范 對(duì)建議的代碼規(guī)范的說明
命名
命名規(guī)則對(duì)于維護(hù)代碼來說是非常重要的,腹侣。Objective-C方法名往往很長(zhǎng),不過這也有好處齿穗,讓很多注釋變得毫無意義傲隶。
本文推薦駝峰法,也是Objective-C社區(qū)的標(biāo)準(zhǔn)窃页。
駝峰法分小駝峰法和大駝峰法跺株。小駝峰法:除第一個(gè)單詞之外,其他單詞首字母大寫脖卖。大駝峰法相比小駝峰法乒省,大駝峰法把第一個(gè)單詞的首字母也大寫了。
1.基本原則
1.1 清晰
又清晰又簡(jiǎn)潔是最好的了畦木,但簡(jiǎn)潔不如清晰重要袖扛。總的講不要使用單詞的簡(jiǎn)寫,除了非常常用的簡(jiǎn)寫以外蛆封,盡量使用單詞全稱唇礁。API的名稱不要有歧義,一看你的API就知道是以什么方式做了什么事情惨篱,不要讓人有疑問
1.2 一致性
做某個(gè)事情代碼通常都叫這個(gè)名字盏筐,比如tag、setStringValue砸讳,那么你也這么叫琢融。你在不確定怎么起名字的時(shí)候,可以參考一些常用的名字:Method Arguments
2. 類命名
類名(不包括類別和協(xié)議名)應(yīng)該用大寫開頭的大駝峰命名法簿寂。類名中應(yīng)該包含一個(gè)或多個(gè)名詞來說明這個(gè)類(或者類的對(duì)象)是做什么的漾抬。
在應(yīng)用級(jí)別的代碼里,盡量不要使用帶前綴的類名常遂。每個(gè)類都有相同的前綴不能提高可讀性奋蔚。不過如果是編寫多個(gè)應(yīng)用間的共享代碼,前綴就是可接受并推薦的做法了(型如 JKPhotoBrowser )烈钞。
示例1:
@interface ImageBrowseView :UIView
@end
示例2:(帶前綴JK)
@interface JKPhotoBrowser :UIView
@end
3. 類別命名
類名+標(biāo)識(shí)+擴(kuò)展(UIImageView +HP+Web)
例:如果我們想要?jiǎng)?chuàng)建一個(gè)基于UIImageView 的類別用于網(wǎng)絡(luò)請(qǐng)求圖片泊碑,我們應(yīng)該把類別
放到名字是UIImageView+HPWeb.h的文件里。UIImageView為要擴(kuò)展的類名毯欣,HP為專屬標(biāo)
識(shí)馒过,Web為擴(kuò)展的功能。
類別的方法應(yīng)該都使用一個(gè)前綴(型如hp_myCategoryMethodOnAString ),以防止Objective-
C代碼在單名空間里沖突酗钞。如果代碼本來就不考慮共享或在不同的地址空間(address-
space)腹忽,方法命名規(guī)則就沒必要恪守了嗤放。
類別HPWeb頭文件贰拿,UIImageView+HPWeb.h如下:
@interface UIImageView (HPWeb)
- (void)hp_setImageWithURLString:(NSString *)urlStr;
@end
4. 方法命名
方法使用小駝峰法命名, 一個(gè)規(guī)范的方法讀起來應(yīng)該像一句完整的話,讀過之后便知函數(shù)
的作用右蒲。執(zhí)行性的方法應(yīng)該以動(dòng)詞開頭葫录,小寫字母開頭着裹,返回性的方法應(yīng)該以返回的內(nèi)容
開頭,但之前不要加get米同。
示例:
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;
(instancetype)arrayWithArray:(NSArray *)array;
如果有參數(shù)骇扇,函數(shù)名應(yīng)該作為第一個(gè)參數(shù)的提示信息,若有多個(gè)參數(shù)面粮,在參數(shù)前也應(yīng)該有
提示信息(一般不必加and)
一些經(jīng)典的操作應(yīng)該使用約定的動(dòng)詞少孝,如initWith,insert,remove,replace,add等等。
5. 變量命名
變量名使用小駝峰法, 使變量名盡量可以推測(cè)其用途屬性具有描述性熬苍。別一心想著少打幾
個(gè)字母稍走,讓你的代碼可以迅速被理解更加重要。
5.1 類成員變量:
成員變量用小駝峰法命名并前綴下劃線,Objective-C 2.0婿脸,@property 和 @synthesize 提供
了遵守命名規(guī)范的解決方法
示例:
@interface ViewController ()
@property (nonatomic,strong)NSMutableArray? ? *dataArray;
@property (nonatomic,strong)UITableView? ? ? *tableView;
@end
@implementation ViewController
@end
5.2 一般變量命名
示例:
NSMutableArray? *ticketsArray = [NSMutableArrayarrayWithCapacity:0];
NSInteger numCompletedConnections =3;
5.3 常量命名
常量(預(yù)定義粱胜,枚舉,局部常量等)使用小寫k開頭的駝峰法盖淡,比如kInvalidHandle ,
kWritePerm
示例:
#define kRunAnnotationStartPointTitle? ? @“起點(diǎn)"
typedef NS_ENUM (NSInteger,RunGoalTypeE){
kRunGoalTypeNone? ? ? = 0,? ? //無目標(biāo)
kRunGoalTypeTime? ? ? = 1,? ? //以時(shí)間為目標(biāo)
kRunGoalTypeDistance? = 2,? ? //以距離為目標(biāo)
kRunGoalTypeCalori? ? = 3,? ? //以消耗卡路里為目標(biāo)
};
NSString *const kGroupInfoName =@"name";
6. 圖片資源文件命名
先看下新浪微博app圖片資源命名方式,下面是部分截圖:
這個(gè)圖片資源命名方式凿歼,以功能為組織形式褪迟,是一個(gè)很好的習(xí)慣,有利于查看資源文件答憔。
原則:
1)采用單詞全拼味赃,或者大家公認(rèn)無岐義的縮寫(比如:nav,bg虐拓,btn等)
2)采用“模塊+功能”命名法心俗,模塊分為公共模塊、私有模塊蓉驹。公共模塊主要包括統(tǒng)一的背
景城榛,導(dǎo)航條,標(biāo)簽态兴,公共的按鈕背景狠持,公共的默認(rèn)圖等等;私有模塊主要根據(jù)app的業(yè)務(wù)
功能模塊劃分瞻润,比如用戶中心喘垂,消息中心等
備注:建議背景圖采用以bg作前綴,按鈕背景采用btn作前綴(不作強(qiáng)制要求绍撞,項(xiàng)目實(shí)際
負(fù)責(zé)人根據(jù)團(tuán)隊(duì)特點(diǎn)確定即可)
公共模塊命名示例:
導(dǎo)航條背影圖片:bg_nav_bar@2x.png
導(dǎo)航返回按鈕:bg_nav_back_normal@2x.png正勒,bg_nav_back_selected@2x.png
標(biāo)簽item背景:bg_tabbar_record_normal@2x.png,bg_tabbar_record_selected@2x.png
私有模塊命名示例:
以Joggers APP的用戶中心圖片資源為例說明傻铣,
uc——user center
用戶中心頭像默認(rèn)圖:bg_uc_avatar@2x.png
用戶中心頂部默認(rèn)背景圖:bg_uc_top_defaut@2x.png
用戶中心底部背景圖:bg_uc_bottom@2x.png
這部分工作較為繁雜章贞,并且在程序員心中會(huì)認(rèn)為是技術(shù)含量較低的一個(gè)工作,但圖片命名
的嚴(yán)謹(jǐn)性同樣會(huì)反映出我們對(duì)細(xì)節(jié)的追求非洲,細(xì)節(jié)決定成敗阱驾。
文件組織結(jié)構(gòu)
1. 類文件組織
iOS工程文件結(jié)構(gòu)分物理結(jié)構(gòu)和邏輯結(jié)構(gòu),建議邏輯結(jié)構(gòu)和物理結(jié)構(gòu)保持一致怪蔑,以便方便有效地管理類文件里覆。類文件組織要遵循以下兩大原則:
基于MVC設(shè)計(jì)模式原則,至少要保證controller與數(shù)據(jù)處理缆瓣,網(wǎng)絡(luò)請(qǐng)求相對(duì)獨(dú)立
基于功能模塊原則喧枷,功能模塊分包括數(shù)據(jù)/網(wǎng)絡(luò)處理,UI前端界面兩部分,數(shù)據(jù)/網(wǎng)絡(luò)處理應(yīng)該在數(shù)據(jù)/網(wǎng)絡(luò)處理的框架下隧甚,而UI前端界面比如用戶中心车荔,消息中心,它們的專有的controller戚扳,view等應(yīng)該在屬于文件夾忧便。還會(huì)遇到一些公共的view,可以開辟出公共的文件夾來管理
在實(shí)際中使用中帽借,項(xiàng)目實(shí)際負(fù)責(zé)人可以結(jié)合項(xiàng)目特點(diǎn)靈活使用珠增,但基本的原則一定要保持,保持良好的類文件組織結(jié)構(gòu)砍艾,對(duì)團(tuán)隊(duì)有益無害蒂教。
2. 圖片資源文件組織
圖片資源文件,強(qiáng)烈建議采用Images.xcassets管理脆荷,盡量少用自己創(chuàng)建的文件夾管理凝垛。
使用Images.xcassets的優(yōu)勢(shì)很多,具體可以查閱讀相關(guān)文獻(xiàn)資料蜓谋,這里只從工程管理上說一點(diǎn)梦皮,在Images.xcassets中添加圖片資源,不會(huì)對(duì)project文件造成改變桃焕,而直接在文件夾里添加圖片文件届氢,每次都會(huì)對(duì)project文件造成改變,因此使用Images.xcassets管理圖片資源可以減少project沖突的次數(shù)覆旭。
下圖是Joggers的文件組織結(jié)構(gòu):
上圖嚴(yán)格按照上述討論組織文件結(jié)構(gòu)退子,保持了物理/邏輯結(jié)構(gòu)的統(tǒng)一,方便團(tuán)隊(duì)間查閱代
碼型将,以及共享資源寂祥。
類代碼組織原則
一個(gè)原則:析構(gòu)函數(shù)- (void)dealloc最好放到類最上面,第一眼就可以看到這個(gè)方法七兜,可以方便看到是否remove了一些操作丸凭,對(duì)內(nèi)存的合理釋放等,controller腕铸,view的生命周期函數(shù)放到最上面惜犀,自己實(shí)現(xiàn)的方法在下面,相同/相近功能的方法采用#pragma mark -來標(biāo)記狠裹,以便查看虽界。
示例:
第一部分主要對(duì)易把握的,易推廣的涛菠,并且對(duì)團(tuán)隊(duì)開發(fā)中有實(shí)實(shí)在在幫助內(nèi)容作簡(jiǎn)要論述莉御,主要集中在命名撇吞,文件組織原則方面,并給了相應(yīng)的示例礁叔。規(guī)范由各項(xiàng)目負(fù)責(zé)人具體執(zhí)行牍颈。好像忘記一件什么事,沒錯(cuò)琅关,注釋煮岁,上述沒有對(duì)注釋做專門的闡述,良好的代碼習(xí)慣就是一個(gè)好的注釋涣易,因此這里不專門為注釋作討論画机,注釋要求由各項(xiàng)目負(fù)責(zé)人來約定。
@傅總 團(tuán)隊(duì)要求
iOS代碼規(guī)范
1 刪除多余的空行
* 所有方法與方法之間空1行
* 所有代碼塊之間空1行
2 刪除多余的注釋
* 刪除注釋掉的代碼
* 刪除沒有意義的注釋
3 刪除多余的方法
* 如果方法沒有使用到都毒,請(qǐng)刪除它
* 如果方法沒有執(zhí)行任何業(yè)務(wù)邏輯色罚,請(qǐng)刪除它或者給出一定注釋
4 刪除未被使用的資源文件
5 添加必要的注釋
* 所有 .h 文件中的property 需要給出注釋
* 所有自定義的方法需要給出注釋
* 比較大的代碼塊需要給出注釋
* 所有代碼中出現(xiàn)的阿拉伯?dāng)?shù)字需要給出注釋
* 程序中出現(xiàn)加密/解密 邏輯的操作地方碰缔,需要給出注釋說明過程(無論是系統(tǒng)還是自定義)
6 整體代碼風(fēng)格需要統(tǒng)一
* 代碼后面的”{“ 不需要單獨(dú)占用一行
* 邏輯運(yùn)算符 與 代碼之前空一格
* “#pragma mark -” 與下面的代碼之前不要空行
* 遵循一般性的代碼規(guī)范
iOS通用規(guī)則
1 下面所有規(guī)則對(duì)第三方類庫(kù)無約束
* 所有類账劲、方法、屬性等命名金抡,做到見名知意瀑焦,采用駝峰式命名規(guī)則
* 根據(jù)資源類型或者所屬業(yè)務(wù)邏輯對(duì)項(xiàng)目資源進(jìn)行分組,使得整個(gè)項(xiàng)目結(jié)構(gòu)清晰明了
* 整個(gè)項(xiàng)目保持一種代碼書寫風(fēng)格(這個(gè)風(fēng)格由無錫團(tuán)隊(duì)根據(jù)自己編碼習(xí)慣來定)梗肝,讓你的代碼變的優(yōu)雅榛瓮!
2. 命名規(guī)范
* 所有類名稱以項(xiàng)目工程開頭命名,eg:“XP”巫击、“ZJG”禀晓、“SZ”
* 針對(duì)不同視圖控制器,在末尾添加后綴坝锰,eg:
* UIViewController? 后綴添加“ViewController”
* UIView 后綴添加“View”
* UIButton 后綴添加“Button"
* UILabel 后綴添加“Label"
3. 單頁(yè)代碼最好控制在800行以內(nèi)粹懒,每個(gè)方法最好不要超過100行,過多建議對(duì)代碼進(jìn)行重構(gòu)
4. 相同的邏輯方法定義避免在多個(gè)地方出現(xiàn)顷级,盡量將公用的類凫乖、方法抽取出來
5. 刪除未被使用的代碼,不要大片注釋未被使用的代碼弓颈,確定代碼不會(huì)使用帽芽,請(qǐng)及時(shí)刪除
6. 對(duì)其他項(xiàng)目中copy過來的代碼,根據(jù)具體需要更新代碼風(fēng)格翔冀,及時(shí)刪除未被使用的代碼
7. 項(xiàng)目中所有Group或者文件名稱(圖片名字等)导街,不要使用漢字命名,盡量使用英文命名纤子,國(guó)內(nèi)特有名詞可以使用拼音菊匿。
8. 項(xiàng)目中所有Group都需要在項(xiàng)目目錄中存在一個(gè)真實(shí)的目錄付呕,Group中的文件與真實(shí)目錄中文件一一對(duì)應(yīng)。
9. 請(qǐng)?jiān)陧?xiàng)目中寫必要代碼的注釋
10. 請(qǐng)多使用 #pragma mark - Mark Name 對(duì)方法進(jìn)行分組 eg:
* #pragma mark - View lifeCycle
* #pragma mark - View lifeTerm
* #pragma mark - Init methods
* #pragma mark - Action methods
* #pragma mark - Common methods
* #pragma mark - UIActionSheetDelegate
* #pragma mark - UIImagePickerControllerDelegate
* #pragma mark - UITableViewDelegate Methods
* #pragma mark - UITableViewDataSource Methods
* #pragma mark - UIScrollViewDelegate Methods
* #pragma mark - UITextFieldDelegate Methods
* #pragma mark - UITextViewDelegate Methods