如何編寫出優(yōu)秀的代碼?
在開發(fā)過程中珊燎,我們不僅要去看別人的代碼危彩,也要讓別人看我們的代碼茶鉴。那么炼杖,有一個(gè)良好的編碼習(xí)慣將會非常重要灭返。下面將會羅列使用Objective-C來開發(fā)iOS的編碼建議。
【1】任意函數(shù)長度不得超過50行坤邪。(其實(shí)很容易就超過50行熙含,這就要考慮代碼抽取了。)
【2】任意行代碼不能超過80字符艇纺。(其實(shí)也很容易超過80字符怎静,可以考慮多行顯示,比如有多個(gè)參數(shù)時(shí)黔衡,可以每個(gè)參數(shù)放一行蚓聘。)可以在Xcode中設(shè)置超過80個(gè)字符的提醒,選中“Page guide at column”.設(shè)置完之后就會在代碼80個(gè)字符處有一條豎線员帮。
【3】在每個(gè)方法的定義前留白一行或粮,也就是在方法和方法之間留空一行。
【4】功能相近的方法要放在一起捞高,并推薦使用#pragma mark - ***來導(dǎo)航代碼氯材,切分代碼塊渣锦。這樣可以方便函數(shù)的查找。并且可以使用快捷鍵control+6 來快速查找方法的位置氢哮。
【5】二元運(yùn)算符和參數(shù)之間要有一個(gè)空格袋毙,如賦值號=左右各留一個(gè)空格。
self.myString = @"235423rew523452345";
【6】一元運(yùn)算符和參數(shù)之間不放置空格冗尤,比如听盖!非運(yùn)算符,&按位與裂七,|按位或皆看。
BOOL isOpen = true;
BOOL isClose = !isOpen;
【7】強(qiáng)制類型轉(zhuǎn)換和參數(shù)之間不放置空格。
NSString *str3 = (NSString*)self.myString;
【8】長的變量值應(yīng)該拆分為多行背零。尤其體現(xiàn)在使用數(shù)組或者字典腰吟。以下也分別是快速聲明數(shù)組@[]和字典@{}的方法。
NSArray *array = @[@"111",
@"2222222222",
@"3333333",
@"wwwwwwwwwwww"
];
@"age":@"20",
@"gender":@"female",
@"isMarried":@"false"
};
【9】盡量使用有意義的名字命名徙瓶,拒絕使用i,j等無意義字符命名毛雇。類的命名首字母大寫,其他變量的命名首字符小寫侦镇,并使用駝峰式分割單詞灵疮。
【10】盡量減少在代碼中直接使用數(shù)字常量,而使用宏定義等方式壳繁。如:MAX_NUMBER_PHONE替代8等等震捣。這樣我們搜索也比較方便。
【11】盡量減少代碼中的重復(fù)計(jì)算氮趋,比如代碼中多處要使用屏幕寬度伍派,然后計(jì)算:[[UIScreenmainScreen] bounds].size.width ,很多次,閑得很繁瑣剩胁,代碼也冗長诉植。不如直接宏定義:
#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
【12】合理使用約定俗成的縮略詞:
alloc:分配;
alt:輪流昵观,交替晾腔;
app:應(yīng)用程序;
calc:計(jì)算啊犬;
dealloc:銷毀灼擂、析構(gòu);
func:函數(shù)觉至、方法剔应;
horiz:水平的;
info:信息;
init:初始化峻贮;
max:最大的席怪;
min:最小的;
msg:消息纤控;
nib:Interface Builder挂捻;
rect:矩形;
temp:暫時(shí)的船万;
vert:垂直的刻撒;
【13】宏定義全部字母大寫。
【14】函數(shù)長度不要超過50行耿导,小函數(shù)比大函數(shù)可讀性更強(qiáng)声怔。函數(shù)的參數(shù)不宜過多,零元函數(shù)最好碎节,一元函數(shù)也不錯(cuò)捧搞,高于三元的函數(shù)虛重構(gòu)。
【15】合理范圍內(nèi)使用鏈?zhǔn)骄幊?
NSString *myName = [[NSString alloc] init];
但是嵌套不宜超過3層狮荔,超過3層需進(jìn)行重構(gòu)。
【16】函數(shù)調(diào)用時(shí)所有參數(shù)在同一行介粘。如果參數(shù)過多殖氏,則可以每行一個(gè)參數(shù),每個(gè)參數(shù)以冒號對齊姻采。
【17】對傳入?yún)?shù)的保護(hù)或者說是否為空的判斷雅采,盡量不要使用if(!obj),而使用NSAssert斷言來處理。NSAssert是系統(tǒng)定義的宏慨亲。
NSAssert(myName != nil, @"myName參數(shù)為空");
如果條件判斷為真婚瓜,則程序繼續(xù)執(zhí)行。
如果判斷條件為假刑棵,則拋出異常巴刻,異常內(nèi)容為后面定義的字符串。
【18】方法參數(shù)名前一般使用"an","the","new"來進(jìn)行修飾蛉签。如:
-(void)setPersonInfo:(NSString*)theID theName:(NSString*)theName theAge:(NSInteger*)theAge
【19】if-else超過四層的時(shí)候胡陪,就要考慮重構(gòu)碍舍,多層的if-else結(jié)構(gòu)很難維護(hù)妈经。
【20】當(dāng)需要一定條件才執(zhí)行某項(xiàng)操作時(shí),最左邊的應(yīng)該是最重要的代碼,不要將最重要的代碼內(nèi)嵌到if中。如良好的風(fēng)格是:
- (void) someMethod {
if(![someOther boolValue]) {
return;
}
//最重要的代碼寫在這里露筒;
}
反面教材:
- (void) someMethod {
if([someOther boolValue]) {
//重要代碼趟径;
}
}
【21】所有的邏輯塊都使用{}花括號包圍,就算只是一行代碼。
【22】明確指定構(gòu)造函數(shù)渺尘,并有適當(dāng)?shù)淖⑨尅?/p>
【23】不要在init方法中把變量或者說屬性初始化為0或者nil锌雀,因?yàn)闆]有必要侈贷。
【24】UIView的子類初始化的時(shí)候上遥,不要進(jìn)行任何的布局操作粉楚。布局操作應(yīng)該在layoutSubviews里面做;需要重新布局的時(shí)候調(diào)用setNeedsLayout亮垫,而不要直接調(diào)用layoutSubviews模软。
【25】保持公共API簡單,也就是保持.h文件簡單饮潦。放在.h中聲明的函數(shù)都是會被公開的燃异,如果根本就沒必要對其他類公開,再不要在.h中聲明继蜡。OC中的方法都是公有方法回俐,沒有私有方法一說。
【26】一個(gè)文件只實(shí)現(xiàn)一個(gè)類稀并。同一個(gè)文件中不要有多個(gè)類仅颇。
【27】Protocol單獨(dú)用一個(gè)文件來創(chuàng)建,盡量不要與相關(guān)類混在一個(gè)文件中稻轨。
【28】在類定義中使用到自己定義類的時(shí)候灵莲,盡量不要在頭文件中引入自己定義類的頭文件,使用@class替代殴俱。而在實(shí)現(xiàn)文件中引入頭文件。
【29】布局時(shí)盡量使用相對布局枚抵,比如使用子View在父View中的相對位置线欲。
【30】代碼折疊,這個(gè)可能是關(guān)于開發(fā)效率的汽摹,我也寫在編碼規(guī)范中李丰,因?yàn)檫@個(gè)很有用。Xcode7默認(rèn)沒有開啟代碼折疊逼泣,如果你的方法體行數(shù)很長趴泌,看起來會很不方便,此時(shí)你就可以把方法“收起來”拉庶,一個(gè)類中的結(jié)構(gòu)就會很清晰嗜憔。開啟方法如下:Xcode菜單-->Preferences-->Text Editing-->勾選Code folding ribbon.如圖:
【31】推薦方法的第一個(gè)花括號直接跟在方法體后,而不是另起一行氏仗,這樣可以減少代碼行吉捶。
【32】推薦方法體中的第一行留空,最后一行不留空,這樣一個(gè)方法就會比較清晰呐舔。如圖:
但是如果該花括號里面又是一個(gè)if币励,for之類的帶花括號的語句塊,那么上述的第一行可以不留空珊拼。
同樣食呻,如果花括號內(nèi)第一行是注釋的話,第一行也可以不留空澎现。注釋也起到了分隔代碼的作用仅胞,看起來比較清晰。
再者昔头,如果花括號內(nèi)只有一行代碼饼问,第一行可以不留空。
【33】block中第一行也要留空揭斧,同方法體中的第一行留空莱革,使代碼清晰。
【34】代表類方法和實(shí)例方法的"+"加號,"-"減號后需要一個(gè)空格讹开。這是一個(gè)非常小的細(xì)節(jié)盅视,系統(tǒng)默認(rèn)的方法都是這樣的,我們自己聲明或者實(shí)現(xiàn)一個(gè)方法的時(shí)候也需要這樣:
【35】這一條有點(diǎn)像編程經(jīng)驗(yàn)了旦万,就是為解決某個(gè)問題估算時(shí)間闹击。比如要開發(fā)某個(gè)功能、調(diào)試某個(gè)bug成艘、給自己一個(gè)時(shí)間限制赏半,如果在這期間不能解決問題,那么就去尋求幫助淆两。這既是給自己一個(gè)壓力断箫,也為了不浪費(fèi)時(shí)間。雖然秋冰,這一條其實(shí)很難做到仲义,我往往由于不甘心而無限拖延時(shí)間去解決問題。
【36】由于提到編程經(jīng)驗(yàn)剑勾,就不得不提到版本控制埃撵。務(wù)必去學(xué)會SVN或者Git,就算你是獨(dú)立開發(fā)虽另,也要學(xué)會控制自己的代碼暂刘,當(dāng)然,你要經(jīng)常備份你的代碼洲赵。
上面都是我的一家之言鸳惯,如果大家的開發(fā)團(tuán)隊(duì)或者公司有自己的編碼規(guī)范商蕴,當(dāng)然按照團(tuán)隊(duì)的來。