Objective C方法命名约定

时间:2011-12-07 04:59:25

标签: iphone objective-c ios xcode

我目前正在使用以下约定

- (id) initWithName:(NSString *) name;

+ (NSString *) aliasForName:(NSString *) name

- (void) method

- (void) methodWithApple:(NSString *) apple andOrange:(NSString *) orange
andMango:(NSString *) mango

- (void) statusWasChanged:(id)sender

您对上述方法有更好的风格吗?

由于

4 个答案:

答案 0 :(得分:53)

Coding Guidelines for Cocoa是回答任何命名约定问题的绝佳资源。我的答案尽可能地基于此。

初始化方法

init方法看起来不错。

- (id) initWithName:(NSString *) name;

类方法

类方法看起来不错。

+ (NSString *) aliasForName:(NSString *) name

类方法也可用于实例化对象的实例。在这种情况下,Apple的API通常使用类的名称开头,例如具有签名的UIButton buttonWithType:方法:

+ (id)buttonWithType:(UIButtonType)buttonType

实例方法

可以在General Rules下找到方法编码约定的良好资源。

以下方法应删除"and" s:

- (void) methodWithApple:(NSString *) apple andOrange:(NSString *) orange
andMango:(NSString *) mango  // BAD
  

请勿使用“和”链接属于接收方属性的关键字。

     

- (int)runModalForDirectory:(NSString *)path file:(NSString *) name types:(NSArray *)fileTypes; 正确

     

- (int)runModalForDirectory:(NSString *)path andFile:(NSString *)name andTypes:(NSArray *)fileTypes; 错误

签名应该更像以下内容:

- (void) methodWithApple:(NSString*)apple orange:(NSString*)orange
mango:(NSString*)mango  // GOOD

Delegate Methods

最后,我认为可以对似乎是委托方法的内容进行一些改进:

- (void) statusWasChanged:(id)sender  // Not horrible, but not ideal

第一个改进是将类名添加到方法中。

  

通过识别正在发送的对象的类来启动名称   消息:

- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row;
- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;

第二项改进是使用"DidChange"代替"WasChanged"

  

对于被调用以通知的方法,请使用“did”或“will”   委托事情已经发生或即将发生。

- (void)browserDidScroll:(NSBrowser *)sender;
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window;

第三个改进是强烈转换sender参数。我没有文档支持这一点,但示例中提供的所有示例都表明了这种行为。请注意上述代码示例中的(NSBrowser*)sender(NSWindow*)window直接取自Apple文档。

考虑到这一点,委托方法看起来应该更像:

- (void) senderClassNameStatusDidChange:(SenderClassName*)sender  // Good

如果发件人是Person对象,它将如下所示:

- (void) personStatusDidChange:(Person*)sender  // Good

请注意,您不应该总是在委托方法中使用“did”。

  

虽然您可以对调用的方法使用“did”或“will”   要求代表代表另一个对象做某事,“应该”   是首选。

- (BOOL)windowShouldClose:(id)sender;

答案 1 :(得分:1)

我想说唯一一个我不确定的是:

- (void) methodWithApple:(NSString *) apple andOrange:(NSString *) orange
andMango:(NSString *) mango

似乎最后两个参数中的“和”是不必要的,或者应该用动词替换。我认为一个好名字在很大程度上取决于调用的上下文,以及对发送的参数将采取的措施。

答案 2 :(得分:1)

- (id) initWithName:(NSString *) name;

框架将任何以init开头的方法理解为返回保留对象的方法(例如,initWithObjectsAndKeysdictionaryWithObjectsAndKeys之间的差异)。因此,您应该考虑到这一点,特别是在使用ARC时。

+ (NSString *) aliasForName:(NSString *) name

使用相同的约定,这种类型的方法将返回自动释放的对象(静态方法与否)

- (void) method

我想说如果只有一个单词,并且这个单词是名词,它应该是属性的吸气剂(如viewsuperview ...)。否则,如果它是一个动词,为什么不添加它引用的对象?与closeModalViewController

一样
- (void) methodWithApple:(NSString *) apple andOrange:(NSString *) orange
andMango:(NSString *) mango

我确实会放弃and

- (void) statusWasChanged:(id)sender

更像Apple-y的方式是statusDidChange:

答案 3 :(得分:0)

除了'和'之外,这些都是很好的命名约定。我倾向于查看Google Style Guide'。