通用规则
在命名方法时,请记住以下几条一般准则:
- 使用小写字母开始名称,并将嵌入单词的第一个字母大写。不要使用前缀。这些指南有两个特定的例外情况。您可以使用大写的众所周知的首字母缩写词(例如TIFF或PDF)开始一个方法名称,并且您可以使用前缀来分组和标识私有方法(请参阅私有方法)。
- 对于表示对象采取的操作的方法,使用动词开始名称:
- (void)invokeWithTarget:(id)target;
- (void)selectTabViewItem:(NSTabViewItem *)tabViewItem
不要使用“do”或“does”作为名称的一部分,因为这些辅助动词很少添加含义。此外,永远不要在动词之前使用副词或形容词。
- 如果方法返回接收者的属性,则在属性后面命名方法。除非间接返回一个或多个值,否则不必使用“get”。
代码 | 评论 |
---|---|
- (NSSize)cellSize; | 对。 |
- (NSSize)calcCellSize; | 错误。 |
- (NSSize)getCellSize; | 错误。 |
- 在所有参数之前使用关键字
代码 | 评论 |
---|---|
- (void)sendAction:(SEL)aSelector toObject:(id)anObject forAllCells:(BOOL)flag; | 对。 |
- (void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag; | 错误。 |
- 在参数之前创建单词描述参数。
代码 | 评论 |
---|---|
- (id)viewWithTag:(NSInteger)aTag; | 对。 |
- (id)taggedView:(int)aTag; | 错误。 |
- 在创建比继承方法更具体的方法时,在现有方法的末尾添加新关键字。
代码 | 评论 |
---|---|
- (id)initWithFrame:(CGRect)frameRect; | NSView,UIView。 |
- (id)initWithFrame:(NSRect)frameRect mode:(int)aMode cellClass:(Class)factoryId numberOfRows:(int)rowsHigh numberOfColumns:(int)colsWide; | NSMatrix,NSView的子类 |
- 不要使用“和”来链接作为接收者属性的关键字。
代码 | 评论 |
---|---|
- (int)runModalForDirectory:(NSString *)path file:(NSString *) name types:(NSArray *)fileTypes; | 对。 |
- (int)runModalForDirectory:(NSString *)path andFile:(NSString *)name andTypes:(NSArray *)fileTypes; | 错误。 |
虽然在这个例子中“和”可能听起来不错,但是当您创建具有越来越多关键字的方法时,它会导致问题。
- 如果该方法描述了两个单独的操作,请使用“和”链接它们。
代码 | 评论 |
---|---|
- (BOOL)openFile:(NSString *)fullPath withApplication:(NSString *)appName andDeactivate:(BOOL)flag; | NSWorkspace。 |
访问方法
访问器方法是设置和返回对象属性值的方法。他们有一些推荐的表格,取决于表达财产的方式:
-
如果属性表示为名词,则格式为:
- (类型)名词;
- (void)set名词:(类型*)aNoun
;例如:
- (NSString *)title;
- (void)setTitle:(NSString *)aTitle;
- 如果属性表示为形容词,则格式为:
- (BOOL)is形容词;
- (void)set形容词:(BOOL)flag;
例如:
- (BOOL)isEditable;
- (void)setEditable:(BOOL)标志;
- 如果属性表示为动词,则格式为:
- (BOOL)verbObject;
- (void)setVerbObject : (BOOL)flag;
例如:
- (BOOL)显示Alpha;
- (void)setShowsAlpha:(BOOL)标志;
动词应该是简单的现在时。
- 不要使用分词将动词转换为形容词:
代码 | 评论 |
---|---|
- (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;
Collection方法
对于管理对象集合的对象(每个对象称为该集合的元素),约定是具有以下形式的方法:
- (void)add元素:(elementType )*anObj;
- (void)remove元素:(elementType *)*anObj;
- (NSArray *)分子;
例如
- (void)addLayoutManager:(NSLayoutManager *)obj;
- (void)removeLayoutManager:(NSLayoutManager *)obj;
- (NSArray *)layoutManagers;
- 以下是本指南的一些资格和改进:
- 如果集合是真正无序的,则返回NSSet对象而不是NSArray对象。
- 如果将元素插入集合中的特定位置很重要,请使用与上述类似的方法, 而不是上述方法:
- (void)setTextStorage:(NSTextStorage *)textStorage;
- (NSTextStorage *)textStorage;
- 上述收集方法约定的另一个例子来自NSWindow类:
-(void)addChildWindow :( NSWindow *)childWindow:(NSWindowOrderingMode)的地方;
- (void)removeChildWindow:(NSWindow *)childWin;
- (NSArray *)childWindows;
- (NSWindow *)parentWindow;
- (void)setParentWindow:(NSWindow *)window;
方法参数
有一些关于方法参数名称的一般规则:
- 与方法一样,参数以小写字母开头,连续单词的第一个字母大写(例如,removeObject:(id)anObject)。
- 不要在名称中使用“指针”或“ptr”。让参数的类型而不是它的名称声明它是否是指针。
- 避免使用单字母和双字母的名称作为参数。
- 避免只保存几个字母的缩写。
...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),以将它们标记为私有。从这个事实可以看出两个建议。
- 不要使用下划线字符作为私有方法的前缀。Apple保留这一惯例。
- 如果您是一个大型Cocoa框架类(如NSView或UIView)的子类,并且您希望绝对确定您的私有方法的名称与超类中的名称不同,则可以将自己的前缀添加到私有方法中。前缀应尽可能唯一,可能基于您的公司或项目以及“XX_”形式。因此,如果您的项目名为Byte Flogger,则前缀可能是 BF_addObject:
虽然给私有方法名称一个前缀的建议似乎与早先声称方法存在于其类的命名空间中的说法相矛盾,但这里的意图是不同的:防止无意覆盖超类私有方法。
网友评论