Reputation: 10101
I am currently using the following conventions
- (id) initWithName:(NSString *) name;
+ (NSString *) aliasForName:(NSString *) name
- (void) method
- (void) methodWithApple:(NSString *) apple andOrange:(NSString *) orange
andMango:(NSString *) mango
- (void) statusWasChanged:(id)sender
Do you have a better style for the above methods?
Thanks
Upvotes: 24
Views: 18204
Reputation: 27354
Coding Guidelines for Cocoa is a great resource for answering any naming convention questions. My answer is as much as possible based off of this.
The init method looks good.
- (id) initWithName:(NSString *) name;
The class method looks good.
+ (NSString *) aliasForName:(NSString *) name
Class methods can also be used to instantiate an instance of an object. In this instance, Apple's API's generally have the method start with the name of the class like UIButton
's buttonWithType:
method that has the signature:
+ (id)buttonWithType:(UIButtonType)buttonType
Good resource for coding conventions for methods can be found under General Rules.
The following method should drop the "and"
s:
- (void) methodWithApple:(NSString *) apple andOrange:(NSString *) orange
andMango:(NSString *) mango // BAD
Don’t use “and” to link keywords that are attributes of the receiver.
- (int)runModalForDirectory:(NSString *)path file:(NSString *) name types:(NSArray *)fileTypes;
right
- (int)runModalForDirectory:(NSString *)path andFile:(NSString *)name andTypes:(NSArray *)fileTypes;
wrong
The signature should look more like the following:
- (void) methodWithApple:(NSString*)apple orange:(NSString*)orange
mango:(NSString*)mango // GOOD
Lastly, I think there are a couple improvements that could be made on what appears to be a delegate method:
- (void) statusWasChanged:(id)sender // Not horrible, but not ideal
First improvement is to add the class name to the method.
Start the name by identifying the class of the object that’s sending the message:
- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row;
- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;
Second improvement is to use "DidChange"
instead of "WasChanged"
.
Use “did” or “will” for methods that are invoked to notify the delegate that something has happened or is about to happen.
- (void)browserDidScroll:(NSBrowser *)sender;
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window;
Third improvement is strongly casting the sender parameter. I don't have documentation to support this, however all examples provided in the examples exude this behavior. Notice the (NSBrowser*)sender
and (NSWindow*)window
in the above code sample taken straight from the apple docs.
With this in mind, the delegate method should look more like:
- (void) senderClassNameStatusDidChange:(SenderClassName*)sender // Good
If the sender were a Person object it would look like:
- (void) personStatusDidChange:(Person*)sender // Good
A word of caution is that you shouldn't always use "did" in delegate methods.
Although you can use “did” or “will” for methods that are invoked to ask the delegate to do something on behalf of another object, “should” is preferred.
- (BOOL)windowShouldClose:(id)sender;
Upvotes: 53
Reputation: 6372
Those are good naming conventions except for the 'and'. I tend to look at the Google Style Guide'.
Upvotes: 0
Reputation: 6650
- (id) initWithName:(NSString *) name;
Any method starting with init
is understood by the framework as a method returning an retained object (difference between initWithObjectsAndKeys
and dictionaryWithObjectsAndKeys
for example). So you should use this convention with that in mind, especially when using ARC.
+ (NSString *) aliasForName:(NSString *) name
Using the same convention, this type of method would return autoreleased objects (static methods or not)
- (void) method
I would say that if there is only one word, and this word is a noun, it should be the getter of a property (like view
, superview
...). Otherwise if it's a verb, why not also add the object it refers to ? Like closeModalViewController
- (void) methodWithApple:(NSString *) apple andOrange:(NSString *) orange
andMango:(NSString *) mango
I would drop the and
indeed.
- (void) statusWasChanged:(id)sender
A more Apple-y way would be statusDidChange:
Upvotes: 1
Reputation: 75058
I would say the only one I'm not sure about is:
- (void) methodWithApple:(NSString *) apple andOrange:(NSString *) orange
andMango:(NSString *) mango
It seems like the "and" in the last two arguments is either unnecessary or should be replaced by a verb. I think a good name really depends a lot on the context of the call, and what will be done with the parameters sent in.
Upvotes: 1