文章內(nèi)容都是在其他博客中東摘西取整理的,如有雷同,請多多見諒>纠歉提!
命名原則
1.一般性原則:可讀性高(簡潔且清晰)和防止命名沖突(通過加前綴后綴來保證)笛坦。 Objective-C 的命名通常都比較長, 名稱遵循駝峰式命名法. 一個好的命名標準很簡單, 就是做到在開發(fā)者一看到名字時, 就能夠懂得它的含義和使用方法. 另外, 每個模塊都要加上自己的前綴, 前綴在編程接口中非常重要, 可以區(qū)分軟件的功能范疇并防止不同文件或者類之間命名發(fā)生沖突, 比如相冊模塊(PhotoGallery)的代碼都以PG作為前綴: PGAlbumViewController
2.一致性盡可能與Cocoa編程接?命名保持一致苔巨。如果你不太確定某個命名的?致性,請瀏覽頭文件或參考文檔中的范例版扩,在使?多態(tài)方法的類中,命名的?致性?常重要。在不同類中實現(xiàn)相同功能的?法應(yīng)該具有同的名稱恋拷。
一资厉、圖片命名
命名規(guī)則的基本思想是把文件名分成三部分:第一部分是圖片的邏輯歸屬分類,第二部分是圖片的表現(xiàn)內(nèi)容蔬顾,第三部分是圖片的內(nèi)容的類型宴偿,有些圖片還會有第四部分湘捎,表示圖片表現(xiàn)的狀態(tài)≌酰基本規(guī)則:
用英文命名窥妇,不用拼音
每一部分用下劃線分隔
圖片名中兩倍圖在名字最后要加@2x,三倍圖在名字最后要加@3x
二娩践、類的命名
類名(以及類別活翩、協(xié)議名)應(yīng)首字母大寫,并以駝峰格式分割單詞翻伺。
1.類的前綴
1)所有類名材泄、枚舉、結(jié)構(gòu)吨岭、protocol定義時最好加一個統(tǒng)一的標示符拉宗,可以是項目縮寫,或者個人項目的名稱縮寫辣辫,例如都加上全大寫的Hoo(我的姓氏)作為前綴
2)根據(jù)功能模塊可以在給功能模塊的類添加功能模塊的名稱前綴旦事,如用戶中心的profileViewController.可以命名為HooUCProfileViewController.
2.類的后綴
所有protocol定義時,都加上后綴Delegate 急灭。如姐浮,HooRefreshViewDelegate,表示RefreshView的協(xié)議葬馋;
所有的控制器都加上Controller,所有的通知名都加上Notification卖鲤。
三、類別命名
類名+標識+擴展(UIImageView +HP+Web)
例:如果我們想要創(chuàng)建一個基于UIImageView 的類別用于網(wǎng)絡(luò)請求圖片点楼,我們應(yīng)該把類別放到名字是UIImageView+HPWeb.h的文件里扫尖。UIImageView為要擴展的類名,HP為專屬標識掠廓,Web為擴展的功能换怖。
四、方法命名
方法名應(yīng)遵守小駝峰原則蟀瞧,首字母小寫沉颂,其他單詞首字母大寫,每個空格分割的名稱以動詞開頭。執(zhí)行性的方法應(yīng)該以動詞開頭悦污,小寫字母開頭铸屉,返回性的方法應(yīng)該以返回的內(nèi)容開頭,但之前不要加get切端。如:
- (void)insertModel:(id)model atIndex:(NSUInteger)atIndex;
- (instancetype)arrayWithArray:(NSArray *)array;
代理方法以發(fā)送代理的對象類名作為代理方法名的開始(去掉類名的前綴彻坛,并且小寫開頭)
- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row;
- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;
五、枚舉的命名
正宗的iOS開發(fā)者當然要以O(shè)bjective-C的方式命名枚舉,如:
typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
UIViewAnimationTransitionNone,
UIViewAnimationTransitionFlipFromLeft,
UIViewAnimationTransitionFlipFromRight,
UIViewAnimationTransitionCurlUp,
UIViewAnimationTransitionCurlDown,
};
六昌屉、屬性钙蒙、變量名命名
變量名使用小駝峰法, 使變量名盡量可以推測其用途,屬性具有描述性间驮。別一心想著少打幾個字母躬厌,讓你的代碼可以迅速被理解更加重要。每個屬性命名都加上類型后綴竞帽,如扛施,按鈕就加上Button后綴,模型就加上Model后綴屹篓。
@property (nonatomic, strong) UIButton *submitButton;
1)類成員變量名
成員變量用小駝峰法命名并前綴下劃線疙渣,如:
UIButton *_submitButton;
2)局部變量名 遵守小駝峰命名規(guī)則,如:
NSInteger numCompletedConnections =3;
七抱虐、const 常量
以小寫k開頭昌阿,后面單詞首字母大寫饥脑,其余小寫恳邀。如:
const float kMaxHeigt = 100.0f;
如果是特殊含義的常量也建議加上后綴,如通知加上Notification為后綴灶轰,如:
extern Nsstring * Const kLoginSuccessNotification
======================20170122補充======================
命名的三個原則:表現(xiàn)力谣沸、清晰、無歧義
Tip1:什么時候需要在聲明變量的時候指明類型笋颤?
原則是,如果在現(xiàn)實世界中顯而易見的乳附,并且不容易產(chǎn)生歧義的,我們不需要聲明類型。
NSString * accountName;
NSMutableArray * mailboxes;
NSArray * defaultHeaders;
BOOL isOpen;
凡是容易產(chǎn)生歧義的伴澄,必須指明類型赋除。
UIImage *avatarImage;
UIImageView *avatarImageView;
NSURL *avatarURL;
Tip2:帶有返回值的方法我們應(yīng)當如何命名?
規(guī)則如下非凌。
[object/class thing+condition];
[object/class thing+input:input];
[object/class thing+identifer:input];
realPath = [path stringByExpandingTildeInPath];
fullString = [string stringByAppendingString:@"Extra Text"];
object = [array objectAtIndex:3];
上述的三個句子string + ByExpandingTildeInPath,string規(guī)定了返回值的類型举农,也就是thing, ByExpandingTildeInPath規(guī)定了條件。
Tip3:如何避免歧義敞嗡?
- (void)sortInfo
- (void)refreshTimer
- (void)update
- (void)fetchInfo:
sortInfo 你究竟是想對Info這個東西進行排序呢?還是想返回排序信息颁糟?
refreshTimer 究竟是想返回一個刷新時間還是執(zhí)行一個刷新操作?
update 想更新什么喉悴?
fetchInfo 是想執(zhí)行獲取信息的操作還是返回fetch的信息棱貌?
如何更改?
- (void)currentSortInfo
- (void)refreshDefaultTimer
- (void)updateMenuItemTitle
- (void)infoForFetch:
current作為形容詞指明了sortInfo是一個名詞,所以很明顯是返回當前的排序信息箕肃。
有了Default那么refresh理所當然的是一個動詞,用來表明這是一次刷新操作
指明了需要更新的對象
指明了info的意思,是關(guān)于Fetch操作的婚脱。
案例一:變量的命名
//材料 UILabel* shicaiLB; // UIImageView* foodImageV; /*步驟*/ //圖標 // UIImageView * imageTB; UILabel * setpLB; //橫線 UIView * lineV; //步驟簡介 UITextView * textLb; //圖片 // UIImageView * imageView; UIImageView * imageEND; //小貼士 UITextView * stsLb;
上面的命名幾乎全部違反了命名的第二條準則。Clear.
第一行注釋寫的是材料。UILabel* shicaiLB
如果是食物的材料障贸,那么實際上應(yīng)該是 ingredient 這個單詞涡贱。LB 這個縮寫我估計是 label 的意思。那么實際上正確的命名應(yīng)該是UILabel *ingredientLabel
第二條,步驟惹想。 UILabel *setpLB
问词,基本的拼寫錯誤。步驟 = step那么正確寫法應(yīng)該是: stepLabel
.實際上這樣寫還是有問題的嘀粱,到底是什么東西的步驟激挪。前面應(yīng)當繼續(xù)加一個形容詞。比如cookingStepLabel
.
第三條锋叨,橫線垄分。這個注釋首先有問題。
橫線到底是 cell 的分割線?還是 view 和 view 之間的分割線?這個分割線到底有什么特點?作用是什么?
我們完全無法從命名中獲知.
第四條,步驟簡介.UITextView *textLB
.這個完全不知道在寫什么.按照注釋的意思,應(yīng)該是stepSummaryTextView
.
第五條,注釋是圖片......我在后續(xù)代碼中發(fā)現(xiàn)這個變量并沒有被用到.
第六條, 小貼士. UITextView * stsLb;
按照他之前的命名邏輯, LB應(yīng)該是等同于Label的意思,那么這時候又用LB作為限定詞給TextView命名,上下邏輯混亂.錯上加錯了.推薦cookingTipsTextView
.```
######案例二:代理方法的命名
//點擊scrollView中的圖片點擊事件協(xié)議@protocol ValueClickDelegate <NSObject>-(void)ADbuttonClick:(NSInteger)vid;@end
代理方法有著非常嚴格的命名規(guī)范.
要以發(fā)出信息的類命作為開始.例如
- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row;
是以tableView作為開頭的.因為這個代理方法是由tableView發(fā)出的.
如果代理方法的參數(shù)只有一個并且是發(fā)出者本身.那么需要指明代理方法的意圖.例如
- (BOOL)applicationOpenUntitledFile:(NSApplication *)sender;
用 did
或者 will
用來說明事件發(fā)生的狀態(tài),例如
- (void)browserDidScroll:(NSBrowser *)sender;
上述這個代理方法主要是為了響應(yīng)點擊圖片之后的行為.所以應(yīng)當寫為.
- (void)scrollView:(AOScrollerView *)scrollView adButtonDidClick:(UIButton *)button;
######案例三:圖片資源的命名
![](http://upload-images.jianshu.io/upload_images/1923392-fdf0988dbd005263.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
圖片文件的命名通用的方法有兩種娃磺。
與聲明變量類似薄湿,都采用駝峰命名法。
全部小寫偷卧,單詞與單詞之間采用_
鏈接豺瘤。 .e.g.login_button_icon
.
我比較建議第二種,因為如果采用第一種有時候會與變量名混淆听诸。
那么坐求,按照第二種命名方式。這三張圖片資源的命名應(yīng)該是晌梨。
homepage_topright_pop_4;
homepage_topright_pop_5;
homepage_topright_pop_6
#######案例四:方法的命名
方法命名的原則:命名需要清楚的指明方法的用途桥嗤,參數(shù)的意義。
我們常常碰到一個方法含有多個參數(shù)的情況仔蝌,如何鏈接這些參數(shù)呢泛领?
如果方法的參數(shù)都是 receiver 的屬性,那么參數(shù)之間的鏈接不可以使用 and
- (int)runModalForDirectory:(NSString *)path file:(NSString *) name types:(NSArray *)fileTypes;
錯誤的做法敛惊。
- (int)runModalForDirectory:(NSString *)path andFile:(NSString *)name andTypes:(NSArray *)fileTypes;
如果你的方法里的參數(shù)來自截然不同的行為渊鞋,那么可以用 and
活著 with
來鏈接。
- (BOOL)openFile:(NSString *)fullPath withApplication:(NSString *)appName andDeactivate:(BOOL)flag;
看看案例
//創(chuàng)建目錄文件夾+(NSString *)CreateList:(NSString *)List ListName:(NSString *)Name;//寫入NsArray文件+(BOOL)WriteFileArray:(NSArray *)ArrarObject SpecifiedFile:(NSString *)path;
首字母應(yīng)當小寫豆混。改完之后是
(NSString *)createList:(NSString *)list listName:(NSString *)name;
createList 和后面的第二個參數(shù) listName 篓像,兩個參數(shù)都含有l(wèi)ist這個名字,那么到底哪個參數(shù)才是list的名字皿伺?
經(jīng)過我看.m文件的實現(xiàn)员辩,才知道,第一個list是上一級目錄的名字鸵鸥,而第二個參數(shù)才是真正的listName奠滑,那么需要把方法改成丹皱。+ (NSString *)createList:(NSString *)listName parentDirectory:(NSString *)directoryName;
參考文章:
[jackiehoo ](http://www.reibang.com/users/902105722a5a)