Objective C方法命名约定

Rya*_*yan 24 iphone xcode objective-c ios

我目前正在使用以下约定

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

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

- (void) method

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

- (void) statusWasChanged:(id)sender
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Sam*_*Sam 53

Cocoa的编码指南是回答任何命名约定问题的重要资源.我的答案是尽可能基于此.

Init方法

init方法看起来不错.

- (id) initWithName:(NSString *) name;
Run Code Online (Sandbox Code Playgroud)

类方法

类方法看起来不错.

+ (NSString *) aliasForName:(NSString *) name
Run Code Online (Sandbox Code Playgroud)

类方法也可用于实例化对象的实例.在这种情况下,Apple的API通常会以类的名称开头,类似于具有签名UIButtonbuttonWithType:方法:

+ (id)buttonWithType:(UIButtonType)buttonType
Run Code Online (Sandbox Code Playgroud)

实例方法

可以在" 一般规则"下找到方法编码惯例的良好资源.

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

- (void) methodWithApple:(NSString *) apple andOrange:(NSString *) orange
andMango:(NSString *) mango  // BAD
Run Code Online (Sandbox Code Playgroud)

不要使用"和"来链接作为接收者属性的关键字.

- (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
Run Code Online (Sandbox Code Playgroud)

代表方法

最后,我认为可以在似乎是委托方法的方面做出一些改进:

- (void) statusWasChanged:(id)sender  // Not horrible, but not ideal
Run Code Online (Sandbox Code Playgroud)

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

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

- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row;
- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;
Run Code Online (Sandbox Code Playgroud)

第二个改进是使用"DidChange"而不是"WasChanged".

对于被调用以通知委托已发生或即将发生某些事情的方法,请使用"did"或"will".

- (void)browserDidScroll:(NSBrowser *)sender;
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window;
Run Code Online (Sandbox Code Playgroud)

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

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

- (void) senderClassNameStatusDidChange:(SenderClassName*)sender  // Good
Run Code Online (Sandbox Code Playgroud)

如果发件人是Person对象,它看起来像:

- (void) personStatusDidChange:(Person*)sender  // Good
Run Code Online (Sandbox Code Playgroud)

需要注意的是,您不应该总是在委托方法中使用"did".

虽然您可以使用"did"或"will"来调用要求委托代表另一个对象执行某些操作的方法,但首选"should".

- (BOOL)windowShouldClose:(id)sender;
Run Code Online (Sandbox Code Playgroud)