命名
Bundle id命名:
規(guī)則:采用反域名命名規(guī)則届吁,全部使用小寫(xiě)字母褒傅。一級(jí)包名為com历涝,二級(jí)包名根據(jù)應(yīng)用進(jìn)行命名榕酒。
類(lèi)命名:
類(lèi)命采取駝峰命名規(guī)則报辱,即首字母必須大寫(xiě)瑞眼,如果為詞組吗铐,則每個(gè)單詞的首字母必須大寫(xiě)息楔,類(lèi)名只能使用名詞或名詞詞組妒峦;并以項(xiàng)目工程開(kāi)頭命名重斑,力求類(lèi)名簡(jiǎn)單 。
繼承自UIView的類(lèi)以View結(jié)尾肯骇。
繼承自ViewController的類(lèi)以ViewController 結(jié)尾窥浪。
保存數(shù)據(jù)的實(shí)體以Model結(jié)尾。
方法的命名:
規(guī)則:方法名第一個(gè)單詞是一個(gè)動(dòng)詞笛丙,其首字母小寫(xiě)漾脂,其后的所有單詞首字母大寫(xiě)。
如:- (void) addNotification{}
類(lèi)中常用方法命名:
類(lèi)的獲取方法
如果返回值為單個(gè)值胚鸯,一般在頭部加上單詞“get”骨稿。如果返回值是數(shù)組或列表,要在頭部加單詞“find”
如:- (NSString*)getUserName{}姜钳、- (NSArray*)findFriends{}
類(lèi)的設(shè)置方法
在被訪(fǎng)問(wèn)字段名的前面加上前綴 set
如:- (void)setName:(NSString *)name{}
類(lèi)的布爾型判斷方法
一般要求方法名使用單詞 is或has 做前綴
如:isNetWorkConnected()
構(gòu)造方法應(yīng)該用遞增的方式寫(xiě)坦冠。
參數(shù)個(gè)數(shù)少的在前
變量命名
規(guī)則:第一個(gè)單詞首字母必須小寫(xiě),往后的單詞需要符合駝峰命名規(guī)則哥桥,即第一個(gè)字母大寫(xiě)辙浑。變量名盡可能的使用名詞或名詞詞組。同樣要求簡(jiǎn)單易懂拟糕,不允許出現(xiàn)無(wú)意義的單詞判呕。
如:String *userName
其他命名規(guī)則
實(shí)例變量命名
加前綴“_”
控件變量命名
規(guī)則:一般的變量命名后加上控件名稱(chēng)
IBOutlet UILabel *userNameLabel;
常量命名:
規(guī)則:必須全部大寫(xiě),單詞間用下劃線(xiàn)隔開(kāi)送滞。
如:MAP_KEY
異常命名:
規(guī)則:自定義異常首字母大寫(xiě)侠草,以 Exception 為結(jié)尾。
如:AppException
資源命名:
項(xiàng)目中所使用的所有資源命名必須以全部單詞小寫(xiě)犁嗅,單詞間以下劃線(xiàn)分割梦抢,加前綴區(qū)分。
原則:
1)采用單詞全拼愧哟,或者大家公認(rèn)無(wú)岐義的縮寫(xiě)(比如:nav奥吩,bg,btn等)
2)采用“模塊+功能”命名法蕊梧,模塊分為公共模塊霞赫、私有模塊。公共模塊主要包括統(tǒng)一的背景肥矢,導(dǎo)航條端衰,標(biāo)簽叠洗,公共的按鈕背景,公共的默認(rèn)圖等等旅东;私有模塊主要根據(jù)app的業(yè)務(wù)
功能模塊劃分灭抑,比如用戶(hù)中心,消息中心等
btn_xx_normal ? ? ? ? ?按鈕正常情況下的效果
btn_xx_press ? ? ? ? ? ? 按鈕點(diǎn)擊下的效果?
bg_head? ? ? ? ? ? ? ? ? ? 背景圖片使用bg_功能_說(shuō)明
def_search_cell? ? ? ? ? 默認(rèn)圖片使用def_功能_說(shuō)明
icon_more_help ? ? ? ? 圖標(biāo)圖片使用icon_功能_說(shuō)明
seg_list_line? ? ? ? ? ? ? 具有分割特征的圖片使用seg_功能_說(shuō)明
sel_ok? ? ? ? ? ? ? ? ? ? ? ? 選擇圖標(biāo)使用sel_功能_說(shuō)明
代碼風(fēng)格
整體代碼風(fēng)格需要統(tǒng)一
Import
Import語(yǔ)句引入的次序如下:
IOS imports
第三方庫(kù)
自定義.h文件
在每組內(nèi)部按字母排序抵代,大寫(xiě)字母排在小寫(xiě)字母的前面腾节。每個(gè)大組之間應(yīng)該空一行。
空格
1. 關(guān)鍵字與其后的表達(dá)式之間需要加空格荤牍。
2. 單目操作符不應(yīng)與操作數(shù)分開(kāi)案腺。
3. 除’,’外,其它雙目操作符應(yīng)與它們的操作數(shù)用空格隔開(kāi)康吵。
4. 在.h中協(xié)議<>前面有一個(gè)空格劈榨。
5. 在.h中成員聲明時(shí),類(lèi)型與變量之間有至少1個(gè)空格晦嵌。*號(hào)靠近變量同辣,不靠近類(lèi)型。
6. @property后留1個(gè)空格惭载,()里面邑闺,逗號(hào)緊跟前一變量,與后一變量之間留1 個(gè)空格棕兼。()外面陡舅,先留1個(gè)空格,再聲明屬性伴挚。
7. 方法的+靶衍,-后面與()。
8. 返回類(lèi)型與*之間留1個(gè)空格茎芋,方法參數(shù)中返回類(lèi)型與*之間留1個(gè)空格
9. 在多參數(shù)方法中颅眶,每個(gè)參數(shù)后面都有1個(gè)空格。
10. Switch..case 語(yǔ)句田弥,代碼塊需要留4個(gè)空格涛酗。
11. If語(yǔ)句嵌套,內(nèi)部if語(yǔ)句需要留4個(gè)空格偷厦。
.h文件空行
以下情況要空行:
1. 頭文件包含(#import)與@class之間
2. @interface與@class之間
3. 頭文件{}內(nèi)商叹,空1行開(kāi)始寫(xiě)成員對(duì)象。
4. 頭文件{}外只泼,空1行開(kāi)始寫(xiě)屬性剖笙。
5. 屬性與方法之間。
6. 如果需要聲明protocol请唱,空2行接著寫(xiě)弥咪。通常protocol寫(xiě)在@end后面过蹂,但是聲明在@interface之前。
7. 方法與方法之間空1行聚至。
8. 方法與@end之間酷勺。
.m文件空行
1. 文件說(shuō)明與頭文件包含(#import)之間。
2. 頭文件包含(#import)之間扳躬。
3. @implementation和@synthesize之間脆诉。
4. @synthesize與方法之間。
5. 變量聲明后需要空1行坦报。
6. 各功能塊之間。
7. #pragma mark 與方法之間狂鞋。
Log
規(guī)則:統(tǒng)一使用自定的log服務(wù)片择,不直接使用系統(tǒng)自帶。
語(yǔ)句
每行只能有一個(gè)語(yǔ)句
每行代碼最多不得操作100個(gè)字符骚揍。
控制語(yǔ)句
If語(yǔ)句
判斷中如果有常量字管,則應(yīng)將常量放在判斷式的右側(cè),如if (a > b)
如:if (index > 0) …… //單條語(yǔ)句,放在if同一行
if (index > 0){ //多行語(yǔ)句
……….
}
While語(yǔ)句
循環(huán)語(yǔ)句中不允許出現(xiàn)表達(dá)式信不。
如while(I < documents.getCount())
盡可能保證.h文件的簡(jiǎn)介性嘲叔,可以不公開(kāi)的API就不要公開(kāi),寫(xiě)在實(shí)現(xiàn)文件中即可
注釋
頭文件注釋?zhuān)?/b>
所有的源文件都應(yīng)該在開(kāi)頭有一個(gè)注釋?zhuān)渲辛谐鲱^文件的相關(guān)描述抽活、作者硫戈、以及對(duì)應(yīng)的版本信息。
/*!
@header 頭文件名稱(chēng)
@abstract 關(guān)于這個(gè)源代碼文件的一些基本描述
@author作者
@version 1.00 2012/01/20 Creation (此文檔的版本信息:版本號(hào)+創(chuàng)建時(shí)間)
*/
類(lèi)注釋
每一個(gè)類(lèi)都要包含如下格式的注釋?zhuān)哉f(shuō)明當(dāng)前類(lèi)的功能等下硕。
/*!
@class類(lèi)名
@abstract 這里可以寫(xiě)關(guān)于這個(gè)類(lèi)的一些描述丁逝。
*/
枚舉注釋
每一個(gè)枚舉都需要包含相對(duì)應(yīng)的enum描述,以及每個(gè)枚舉值對(duì)應(yīng)的含義梭姓。
/*!
@enum枚舉名稱(chēng)
@abstract 關(guān)于這個(gè)enum的一些基本信息
@constant 各個(gè)對(duì)應(yīng)值得含義霜幼,如: OKButton 對(duì)應(yīng)的是OK按鈕的Tag
*/
typedef NS_ENUM (NSInteger,RunGoalTypeE){
kRunGoalTypeNone= 0,//無(wú)目標(biāo)
kRunGoalTypeTime= 1,//以時(shí)間為目標(biāo)
kRunGoalTypeDistance= 2,//以距離為目標(biāo)
kRunGoalTypeCalori= 3,//以消耗卡路里為目標(biāo)
};
協(xié)議注釋
協(xié)議需要注明是哪個(gè)類(lèi)對(duì)應(yīng)的protocol,以及自身的相關(guān)描述誉尖。
/*!
@protocol 協(xié)議名稱(chēng)
@abstract 這是哪個(gè)類(lèi)的protocol
@discussion 具體描述信息
*/
方法注釋
包括當(dāng)前方法的用途罪既,當(dāng)前方法參數(shù)的含義,當(dāng)前方法返回值的內(nèi)容和對(duì)應(yīng)的錯(cuò)誤參照铡恕。
/*!
@method 方法名
@abstract該方法的一些簡(jiǎn)要描述
@discussion該方法的具體使用方式琢感,需要注意的地方,如果你是設(shè)計(jì)一個(gè)抽象類(lèi)或者一個(gè)共通類(lèi)給給其他類(lèi)繼承的話(huà)探熔,在這里需要具體描述一下怎樣使用這個(gè)方法猩谊。
@param text參數(shù)列表
@param error 錯(cuò)誤參照
@result 返回結(jié)果
*/
屬性注釋
/*!
@property 屬性名稱(chēng)
@abstract 該P(yáng)roperty的一些基本描述。
*/
類(lèi)別注釋
/*!
@category 類(lèi)別名稱(chēng)
@abstract 哪個(gè)類(lèi)的類(lèi)別
*/
文件組織結(jié)構(gòu)
1. 類(lèi)文件組織
建議邏輯結(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前端界面比如用戶(hù)中心撤防,消息中心虽风,它們的專(zhuān)有的controller,view等應(yīng)該在屬于文件夾寄月。還會(huì)遇到一些公共的view辜膝,可以開(kāi)辟出公共的文件夾來(lái)管理
在實(shí)際中使用中, 可以結(jié)合項(xiàng)目特點(diǎn)靈活使用漾肮,但基本的原則一定要保持厂抖,保持良好的類(lèi)文件組織結(jié)構(gòu),對(duì)團(tuán)隊(duì)有益無(wú)害克懊。
2. 圖片資源文件組織
圖片資源文件忱辅,強(qiáng)烈建議采用Images.xcassets管理,盡量少用自己創(chuàng)建的文件夾管理谭溉。
使用Images.xcassets的優(yōu)勢(shì)很多墙懂,具體可以查閱讀相關(guān)文獻(xiàn)資料,這里只從工程管理上說(shuō)一點(diǎn)扮念,在Images.xcassets中添加圖片資源损搬,不會(huì)對(duì)project文件造成改變,而直接在文件夾里添加圖片文件柜与,每次都會(huì)對(duì)project文件造成改變场躯,因此使用Images.xcassets管理圖片資源可以減少project沖突的次數(shù)。
2. 類(lèi)代碼組織
一個(gè)原則:析構(gòu)函數(shù)- (void)dealloc最好放到類(lèi)最上面旅挤,第一眼就可以看到這個(gè)方法踢关,可以方便看到是否remove了。一些操作粘茄,對(duì)內(nèi)存的合理釋放等签舞,controller,view的生命周期函數(shù)放到最上面柒瓣,自己實(shí)現(xiàn)的方法在下面儒搭,相同/相近功能的方法采用#pragma mark -來(lái)標(biāo)記,以便查看芙贫。
修改規(guī)范
新增代碼行
新增代碼行的前后應(yīng)有注釋行說(shuō)明搂鲫。
//修改人,修改時(shí)間磺平,修改說(shuō)明
新增代碼行
//修改結(jié)束
刪除代碼行
刪除代碼向的前后用注釋行說(shuō)明
//修改人魂仍,修改時(shí)間拐辽,修改說(shuō)明
要?jiǎng)h除的代碼行(將要?jiǎng)h除的語(yǔ)句進(jìn)行注釋)
//修改結(jié)束
修改代碼行
修改代碼行以注釋舊代碼行后再新增代碼行的方式進(jìn)行。
//修改人擦酌,修改時(shí)間俱诸,修改說(shuō)明
//修改前代碼行開(kāi)始
//修改前代碼行
//修改前代碼行結(jié)束
//修改后代碼行開(kāi)始
修改后代碼行
//修改結(jié)束
避免出現(xiàn)的情況
永遠(yuǎn)不要有空的catch語(yǔ)句。替代方案:向方法的調(diào)用者拋出異常赊舶、或者抽象級(jí)別拋出新異常睁搭。
避免在一條語(yǔ)句中給多個(gè)變量賦相同的值
不要將賦值運(yùn)算符用在與相等運(yùn)算符混淆的地方
重復(fù)代碼,復(fù)制-粘貼
長(zhǎng)方法笼平,將所有邏輯處理放在一個(gè)方法里面园骆,每個(gè)方法都應(yīng)有其自己的意圖
大類(lèi),妄想將所有模塊放在一個(gè)類(lèi)中實(shí)現(xiàn)寓调。
小類(lèi)锌唾,一個(gè)類(lèi)所承擔(dān)的責(zé)任太少,應(yīng)該將其消除捶牢,類(lèi)的維護(hù)需要額外的開(kāi)銷(xiāo)