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方法看起来不错.
- (id) initWithName:(NSString *) name;
Run Code Online (Sandbox Code Playgroud)
类方法看起来不错.
+ (NSString *) aliasForName:(NSString *) name
Run Code Online (Sandbox Code Playgroud)
类方法也可用于实例化对象的实例.在这种情况下,Apple的API通常会以类的名称开头,类似于具有签名UIButton的buttonWithType:方法:
+ (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)