【问题标题】:Objective C method naming conventionObjective C 方法命名约定
【发布时间】:2011-12-07 04:59:25
【问题描述】:

我目前使用以下约定

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

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

- (void) method

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

- (void) statusWasChanged:(id)sender

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

谢谢

【问题讨论】:

  • 对于initWithName,请确保您了解 ARC 将如何处理此问题(即返回保留对象)
  • 你的命名约定很好..

标签: iphone objective-c ios xcode


【解决方案1】:

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

初始化方法

init 方法看起来不错。

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

类方法

类方法看起来不错。

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

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

+ (id)buttonWithType:(UIButtonType)buttonType

实例方法

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

下面的方法应该去掉"and"s:

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

不要使用“and”来链接作为接收者属性的关键字。

- (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 直接取自苹果文档。

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

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

如果发送者是一个 Person 对象,它看起来像:

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

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

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

- (BOOL)windowShouldClose:(id)sender;

【讨论】:

【解决方案2】:

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

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

最后两个参数中的“and”似乎是不必要的,或者应该用动词代替。我认为一个好名字真的很大程度上取决于调用的上下文,以及传入的参数会做什么。

【讨论】:

    【解决方案3】:
    - (id) initWithName:(NSString *) name;
    

    框架将任何以init 开头的方法理解为返回保留对象的方法(例如initWithObjectsAndKeysdictionaryWithObjectsAndKeys 之间的差异)。因此,您应该牢记这一点来使用此约定,尤其是在使用 ARC 时。

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

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

    - (void) method
    

    我想说如果只有一个词,而这个词是名词,它应该是属性的getter(如viewsuperview...)。否则,如果它是动词,为什么不添加它所指的对象呢?赞closeModalViewController

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

    我确实会放弃and

    - (void) statusWasChanged:(id)sender
    

    statusDidChange: 是一种更符合 Apple 风格的方式

    【讨论】:

    • +1 好答案。我对statusWasChanged: 的想法是一样的,直到我意识到委托方法,这是我假设的,其中缺少发件人的姓名。它应该更像-(void)senderNameStatusDidChange:(id)sender。因此,如果发件人是个人,则类似于-(void)personStatusDidChange:(Person*)person。这方面的文档通常也会强烈要求发件人。请参阅[委托方法][developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多