我目前正在使用以下约定
- (id) initWithName:(NSString *) name;
+ (NSString *) aliasForName:(NSString *) name
- (void) method
- (void) methodWithApple:(NSString *) apple andOrange:(NSString *) orange
andMango:(NSString *) mango
- (void) statusWasChanged:(id)sender
您对上述方法有更好的风格吗?
由于
答案 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
最后,我认为可以对似乎是委托方法的内容进行一些改进:
- (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
开头的方法理解为返回保留对象的方法(例如,initWithObjectsAndKeys
和dictionaryWithObjectsAndKeys
之间的差异)。因此,您应该考虑到这一点,特别是在使用ARC时。
+ (NSString *) aliasForName:(NSString *) name
使用相同的约定,这种类型的方法将返回自动释放的对象(静态方法与否)
- (void) method
我想说如果只有一个单词,并且这个单词是名词,它应该是属性的吸气剂(如view
,superview
...)。否则,如果它是一个动词,为什么不添加它引用的对象?与closeModalViewController
- (void) methodWithApple:(NSString *) apple andOrange:(NSString *) orange
andMango:(NSString *) mango
我确实会放弃and
。
- (void) statusWasChanged:(id)sender
更像Apple-y的方式是statusDidChange:
答案 3 :(得分:0)
除了'和'之外,这些都是很好的命名约定。我倾向于查看Google Style Guide'。