Cocoa 編碼指南 為方法命名
Cocoa 編碼指南 為方法命名是本文要介紹的內(nèi)容,方法可能是編程接口中最常見的元素了,因此對(duì)其命名要特別注意。本部分討論方法命名的相關(guān)方面:
通用規(guī)則
為方法命名時(shí),請(qǐng)記住下面這些通用的指導(dǎo)原則:
方法名稱應(yīng)以小寫字符開頭,名稱中的單詞首字符要大寫。另外,請(qǐng)不要在方法名稱中使用前綴。您可以參考“書寫約定”一節(jié),以了解更多信息。
有兩種特定的情況不適用該原則。其一,方法的名稱可以使用某個(gè)眾所周知的縮寫開頭,而該縮寫可以大寫(例如,TIFF 或者PDF)。其二,您可以使用前綴來分組并區(qū)分私有方法(請(qǐng)參考“私有方法”一節(jié))。
如果方法代表一個(gè)對(duì)象執(zhí)行的動(dòng)作,則其名稱應(yīng)該以一個(gè)動(dòng)詞開頭:
- (void)invokeWithTarget:(id)target;
- (void)selectTabViewItem:(NSTabViewItem *)tabViewItem
請(qǐng)不要使用 “do”或者 “does”作為名稱的一部分,因?yàn)檫@些輔助性的動(dòng)詞 不能為名稱增加更多的含義。同時(shí),請(qǐng)不要在動(dòng)詞之前使用副詞或者形容詞。
如果方法返回接收者的某個(gè)屬性,則以屬性名稱作為方法名。如果方法沒有間接地返回一個(gè)或多個(gè)值,您也無須使用”get“這樣的單詞。
- (NSSize)cellSize;正確
- (NSSize)calcCellSize;錯(cuò)誤
- (NSSize)getCellSize; 錯(cuò)誤
您可以參考 “存取方法”一節(jié),以了解更多的信息。
所有參數(shù)前面都應(yīng)使用關(guān)鍵字。
- (void)sendAction:(SEL)aSelector to:(id)anObject forAllCells:(BOOL)flag;正確
- (void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag;錯(cuò)誤
參數(shù)前面的單詞應(yīng)能夠?qū)?shù)進(jìn)行描述。
- (id)viewWithTag:(int)aTag;正確
- (id)taggedView:(int)aTag;錯(cuò)誤
如果您當(dāng)前創(chuàng)建的方法比起它所繼承的方法更有針對(duì)性,則您應(yīng)該在已有的方法名稱后面添加關(guān)鍵字,并將其作為新方法的名稱。
- (id)initWithFrame:(NSRect)frameRect; NSView
- (id)initWithFrame:(NSRect)frameRect mode:(int)aMode cellClass:(Class)factoryId numberOfRows:(int)rowsHigh numberOfColumns:
- (int)colsWide;NSMatrix是NSView的子類。
請(qǐng)不要使用”and“來連接兩個(gè)表示接受者屬性的關(guān)鍵字。
- (int)runModalForDirectory:(NSString *)path file:(NSString *) name types:(NSArray *)fileTypes;正確
- (int)runModalForDirectory:(NSString *)path andFile:(NSString *)name andTypes:(NSArray *)fileTypes;錯(cuò)誤
雖然上面的例子使用”and“這個(gè)詞感覺還不錯(cuò),但是隨著創(chuàng)建的方法所帶有的關(guān)鍵字越來越多,這種方式會(huì)引起問題。
如果方法描述了兩個(gè)獨(dú)立的動(dòng)作,請(qǐng)使用”and“把它們連接起來。
- (void)setNoun:(type)aNoun;
- (type)noun;
存取方法
存取方法用于設(shè)置或返回對(duì)象的屬性(也就是對(duì)象的實(shí)例變量)。由于屬性的表示方法不同,我們提倡的存取方法的格式也有差異:
如果某個(gè)屬性使用名詞來表示,則方法的格式如下:
- (void)setNoun:(type)aNoun;
- (type)noun;
例如:
- (void)setColor:(NSColor *)aColor;
- (NSColor *)color;
如果某個(gè)屬性使用形容詞表示, 則方法的格式為:
- (void)setAdjective:(BOOL)flag;
- BOOL)isAdjective;
例如:
- (void)setEditable:(BOOL)flag;
- BOOL)isEditable;
如果某個(gè)屬性使用動(dòng)詞表示,則方法的格式為:
- (void)setVerbObject:(BOOL)flag;
- (BOOL)verbObject;
例如:
- (void)setShowsAlpha:(BOOL)flag;
- (BOOL)showsAlpha;
這種情況下,動(dòng)詞應(yīng)使用一般現(xiàn)在時(shí)的格式。
請(qǐng)不要使用分詞形式把動(dòng)詞轉(zhuǎn)換為形容詞:
- (void)setAcceptsGlyphInfo:(BOOL)flag;正確
- (BOOL)acceptsGlyphInfo;正確
- (void)setGlyphInfoAccepted:(BOOL)flag;錯(cuò)誤
- (BOOL)glyphInfoAccepted;錯(cuò)誤
您可以使用情態(tài)動(dòng)詞(在動(dòng)詞前冠以“can”,"should","will"等),使得方法的名稱更加明確,但是請(qǐng)不要使用“do”或“does”這樣的情態(tài)動(dòng)詞。
- (void)setCanHide:(BOOL)flag;正確
- (BOOL)canHide;正確
- (void)setShouldCloseDocument:(BOOL)flag;正確
- (BOOL)shouldCloseDocument;正確
- (void)setDoesAcceptGlyphInfo:(BOOL)flag;錯(cuò)誤
- (BOOL)doesAcceptGlyphInfo;錯(cuò)誤
只有當(dāng)方法間接地返回對(duì)象或者數(shù)值,您才需要在方法名稱中使用get"。這種格式只適用于需要返回多個(gè)數(shù)據(jù)項(xiàng)的方法。
- (void)getLineDash:(float *)pattern count:(int *)count phase:(float *)phase;
- NSBezierPath
如果方法格式和上面一樣,則其實(shí)現(xiàn)應(yīng)該能夠接受NULL 參數(shù),這樣調(diào)用者才能夠表明他們對(duì)其中的一個(gè)或者多個(gè)返回值不感興趣。
委托方法
委托方法是指當(dāng)某些事件發(fā)生時(shí),對(duì)象在委托里調(diào)用的處理方法(如果委托實(shí)現(xiàn)了它們)。委托方法的格式獨(dú)特,但它也適用于在對(duì)象數(shù)據(jù)源里調(diào)用的方法:
方法名稱的開頭應(yīng)標(biāo)識(shí)出發(fā)送消息的對(duì)象所屬的類:
- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row;
- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;
在此,類的名稱不需要使用前綴并且首字符要小寫。
除非方法只有一個(gè)參數(shù),并且該參數(shù)表示消息的發(fā)送者,否則類名稱后面都要加上一個(gè)冒號(hào)(參數(shù)是委托對(duì)象的引用)。
- (BOOL)applicationOpenUntitledFile:(NSApplication *)sender;
如果是因?yàn)榘l(fā)送了一則通告而導(dǎo)致某個(gè)方法被調(diào)用,則上述原則不適用。在這種情況下,方法僅有的一個(gè)參數(shù)是通告對(duì)象。
- (void)windowDidChangeScreen:(NSNotification *)notification;
如果調(diào)用某個(gè)方法是為了通知委托某個(gè)事件已經(jīng)發(fā)生或者即將發(fā)生, 則請(qǐng)?jiān)诜椒Q中使用“did”或者“will”這樣的助動(dòng)詞。
- (void)browserDidScroll:(NSBrowser *)sender;
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window;
如果調(diào)用某個(gè)方法是為了要求委托代表其他對(duì)象執(zhí)行某件事,當(dāng)然,您也可以在方法名稱中使用“did”或者“will”,但我們傾向于使用“should”。
- (BOOL)windowShouldClose:(id)sender;
集合方法
對(duì)于管理一個(gè)對(duì)象集合的對(duì)象(每個(gè)被管理的對(duì)象稱為集合的一個(gè)元素),習(xí)慣上,我們要求它具有如下格式的方法:
- (void)addElement:(elementType)anObj;
- (void)removeElement:(elementType)anObj;
- (NSArray *)elements;
例如:
- (void)addLayoutManager:(NSLayoutManager *)obj;
- (void)removeLayoutManager:(NSLayoutManager *)obj;
- (NSArray *)layoutManagers;
下述內(nèi)容是該原則的條件和細(xì)化:
如果集合確實(shí)是無序的, 則應(yīng)返回一個(gè)NSSet類型的對(duì)象,而不是返回NSArray對(duì)象。
如果把元素插入到集合的指定位置這一功能很重要,則應(yīng)使用與下面類似的方法來替換或者補(bǔ)充前述的某些方法。
- (void)insertLayoutManager:(NSLayoutManager *)obj atIndex:(int)index;
- (void)removeLayoutManagerAtIndex:(int)index;
使用集合方法時(shí), 您需要記住下面這兩條實(shí)現(xiàn)細(xì)節(jié):
上述方法通常隱含了它們對(duì)于被插入對(duì)象的所有權(quán),因此,用于添加或者插入對(duì)象的代碼必須增加對(duì)象的計(jì)數(shù),而用于移除對(duì)象的代碼也必須要釋放對(duì)象。
如果被插入的對(duì)象需要有一個(gè)指針指向其幕后的主對(duì)象, 則通常情況下, 您應(yīng)該使用 set...這樣方法,它可以設(shè)置對(duì)象的背后對(duì)象指針,但并不增加其引用計(jì)數(shù)。我們以 insertLayoutManager:atIndex:方法為例,NSLayoutManager使用如下方法來實(shí)現(xiàn)這一功能:
- (void)setTextStorage:(NSTextStorage *)textStorage;
- (NSTextStorage *)textStorage;
正常情況下, 您應(yīng)該不會(huì)直接調(diào)用setTextStorage:方法,但可能需要對(duì)其進(jìn)行重寫。
我們還有另外一個(gè)示列用于展示集合方法的上述約定,它來自于NSWindow類:
- (void)addChildWindow:(NSWindow *)childWin ordered:(NSWindowOrderingMode)place;
- (void)removeChildWindow:(NSWindow *)childWin;
- (NSArray *)childWindows;
- (NSWindow *)parentWindow;
- (void)setParentWindow:(NSWindow *)window;
方法的參數(shù)
下面是數(shù)條和方法參數(shù)命名相關(guān)的通用規(guī)則:
和方法名稱一樣, 參數(shù)的名稱也是以小寫的字符開頭,并且后續(xù)單詞的首字符要大寫。例如:removeObject:(id)anObject)。
請(qǐng)不要在參數(shù)名稱中使用"pointer"或者"ptr"。您應(yīng)該使用參數(shù)的類型來聲明參數(shù)是否是一個(gè)指針。
請(qǐng)不要使用一到兩個(gè)字符的名稱作為參數(shù)名。
請(qǐng)不要使用只剩幾個(gè)字符的縮寫。
習(xí)慣上(在Cocoa中),我們把下面的關(guān)鍵字和參數(shù)應(yīng)該組合在一起使用:
- ...action:(SEL)aSelector
- ...alignment:(int)mode
- ...atIndex:(int)index
- ...content:(NSRect)aRect
- ...doubleValue:(double)aDouble
- ...floatValue:(float)aFloat
- ...font:(NSFont *)fontObj
- ...frame:(NSRect)frameRect
- ...intValue:(int)anInt
- ...keyEquivalent:(NSString *)charCode
- ...length:(int)numBytes
- ...point:(NSPoint)aPoint
- ...stringValue:(NSString *)aString
- ...tag:(int)anInt
- ...target:(id)anObject
- ...title:(NSString *)aString
私有方法
大多數(shù)情況下,私有方法遵循和公共方法一樣的命名規(guī)則。但是,有一種常見的約定是為私有方法添加一個(gè)前綴,這樣我們就很容易區(qū)分它們。但即便是利用這樣的約定,私有方法的名稱還是有可能導(dǎo)致奇怪的問題。當(dāng)您為某個(gè)Cocoa框架類設(shè)計(jì)子類時(shí),您無法知道您的某個(gè)私有方法是否在無意中覆蓋了具有相同名稱的私有的框架方法。
大部分Cocoa框架中私有方法的名稱都帶有一個(gè)下劃線前綴(例如,_fooData ),這個(gè)前綴把方法標(biāo)記為私有。根據(jù)這樣的實(shí)際情況,我們給出兩條建議:
請(qǐng)不要在您的私有方法中使用下劃線作為前綴,因?yàn)樘O果公司保留使用這種命名約定。
在為某個(gè)很大的Cocoa框架類(例如NSView)派生子類時(shí),如果需要絕對(duì)保證子類私有方法名稱不會(huì)和超類發(fā)生沖突,則您可以為子類私有方法添加自己的前綴。前綴應(yīng)該盡可能地具有***性,也許您的前綴可以基于公司或者項(xiàng)目名稱,并且使用"XX_"這樣的格式。例如,如果您的項(xiàng)目叫做Byte Flogger,則前綴可以是BF_addObject:這樣的格式。
盡管為私有方法名稱添加前綴似乎和早前我們對(duì)類方法的命名要求相矛盾,但這是因?yàn)榇颂幍哪康暮驮缜安煌何覀冞@么做是為了避免在無意中重寫了超類中的私有方法。
小結(jié):關(guān)于Cocoa 編碼指南 為方法命名的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!推薦幾篇相關(guān)內(nèi)容:
Cocoa 編碼指南 代碼命名基礎(chǔ): http://mobile.51cto.com/iphone-274085.htm
Cocoa 編碼指南 為函數(shù)命名: http://www.scjtxx.cn/php/viewart.php?artID=274108
Cocoa 編碼指南 為方法命名: http://www.scjtxx.cn/php/viewart.php?artID=274104
Cocoa 編碼指南 為實(shí)例變量和數(shù)據(jù)類型命名:http://www.scjtxx.cn/php/viewart.php?artID=274094
Cocoa 編碼指南 框架開發(fā)者使用技巧和技術(shù)http://www.scjtxx.cn/php/viewart.php?artID=274094