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