方法可能是编程接口中最常见的元素,因此在命名方法时应特别注意。以下罗列的是针对使用Objective-C语言的iOS开发命名规范。
一般规则
- 以小些字母开头,驼峰命名;不要使用前缀,因方法存在于由定义它们的类创建的命名空间中(通常类的命名都会加上自己的前缀)。
这些准则有两个特定的例外: 1.有特定含义的简写单词可以作为方法开头(比如PDF、TIFF); 2.使用前缀对私有方法进行分组和标识(请参阅私有方法)。
- 对于表示对象执行操作的方法,以动词开头:
- (void)selectTabViewItem:(NSTabViewItem *)tabViewItem
不要使用"do"或者"dose"作为动词的一部分,因为这些辅助动词没有为方法添加太多精确的含义。此外,不要在动词前面添加额外的动词和形容词。
-
如果方法的返回值是新创建的,那么方法的首个词应是返回值的类型,除非前面还有修饰语,例如localizedString。属性的存取方法不遵守这种命名方式,因为一般认为这些方法不会创建新对象,即便有时返回内部对象的一份拷贝,我们也认为那相当于原有的对象。这些存取方法应该按照其所对应的属性来命名。
方法名 是否正确 - (NSSize)cellSize; 正确 - (NSSize)calcCellSize; 错误 - (NSSize)getCellSize; 错误 -
在所有参数之前使用关键字,并适当带有"in"、"for"、"with"等介词,使得方法从左往右读起来像句子一样。
方法名 是否正确 - (void)sendAction:(SEL)aSelector toObject:(id)anObject forAllCells:(BOOL)flag; 正确 - (void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag; 错误
访问器方法(Accessor Methods)
访问器方法是设置和返回对象属性值的方法。它们具有一些不同的形式,这需要根据情况来区分:
- 如果属性表示为名词(noun),则格式为:
- (type)noun;
- (void)setNoun:(type)aNoun;
例如:
- (NSString *)title;
- (void)setTitle:(NSString *)aTitle;
- 如果属性表示为形容词(adjective),则格式为:
- (BOOL)isAdjective;
- (void)setAdjective:(BOOL)flag;
例如:
- (BOOL)isEditable;
- (void)setEditable:(BOOL)flag;
- 如果属性表示为动词(verb),则格式为:
- (BOOL)verbObject;
- (void)setVerbObject:(BOOL)flag;
例如:
- (BOOL)showsAlpha;
- (void)setShowsAlpha:(BOOL)flag;
- 你可以使用情态动词(例如"can"、"should"、"can"等)来指明含义,但不要使用"do"或"does"。
方法名 | 是否正确 |
---|---|
- (void)setCanHide:(BOOL)flag; | 正确 |
- (void)setCanHide:(BOOL)flag; | 正确 |
- (void)setShouldCloseDocument:(BOOL)flag; | 正确 |
- (BOOL)shouldCloseDocument; | 正确 |
- (void)setDoesAcceptGlyphInfo:(BOOL)flag; | 错误 |
- (void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag; | 错误 |
- 仅对间接返回对象和值的方法或者需要返回多个值时,才使用get作为前缀的方法。例如:
NSBezierPath方法 :- (void)getLineDash:(float *)pattern count:(int *)count phase:(float *)phase;
以及NSString方法:- (void)getCharacter:(unichar *)buffer range:(NSRange)aRange
委托方法(Delegate Methods)
委托方法是对象当发生某些事件时,在其代理中调用的方法(如果代理实现了这些方法)。
- 以消息的接收者类名作为方法的开头,并且类名通常省略掉前缀并且小写字母开头。这么做的原因在于:你不应该把自己的类放到其他框架的命名空间里面,那些框架以后也许会新建同名的类。
- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row;
- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;
- 如过想通知代理已发生或即将发生的事件,委托方法可以使用"did"或"will"命名方法。
- (void)browserDidScroll:(NSBrowser *)sender;
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window;
私有方法(Private Methods)
把私有方法标出来,这样很容易就能看出哪些方法可以随意修改,哪些不应轻易改动。为此Apple给了两条建议:
- 不要使用下划线字符作为私有方法的前缀。这是预留给苹果自己使用的。
- 如果要对大型 Cocoa 框架类(如 NSView 或 UIView)进行继承,并且希望绝对确保私有方法的名称与超类中的名称不同,则可以向私有方法添加自己的前缀。前缀应该尽可能唯一,可能基于你的公司或项目以及"XX_"的形式。因此,如果项目称为 Byte Flogger,则前缀可能是 BF_addObject。
尽管为私有方法名称提供前缀的建议,似乎与先前声称的方法存在于其类的命名空间中的说法相矛盾,但此处的意图是不同的:防止意外重写超类私有方法。
总结:
- 不要使用str这种简称,应该用string这样的全称。别吝啬于使用长方法名,把方法名起得稍微长一点,可以保证其能准确传达出所执行的任务。这就是Objective-C的命名风格。别说方法,人家苹果官方文档都可以给常量定80个字母长定名称
NSString *const CNLabelContactRelationElderCousinMothersSiblingsDaughterOrFathersSistersDaughter;
CNLabelContactRelationElderCousinMothersSiblingsDaughterOrFathersSistersDaughter
- 当然方法名里面也要言简意赅,读起来要像日常句子那样,下面那样就没必要了:
- (float)calculateTheArea // 太冗余了
- 给方法起名时第一要务就是确保其风格与你自己的代码或所要集成的框架相符。
网友评论