为什么我们需要命名方法参数?

时间:2014-04-04 20:11:24

标签: objective-c

我们现在拥有的:

@interface BGTest
-(void)someMethodWithName:(NSString *)methodName tag:(NSUInteger)tag path:(NSURL *)path;
@end

为什么不写:

@interface BGTest
-(void)someMethodWithName:(NSString *) tag:(NSUInteger) path:(NSURL *)
@end

据说ObjC方法名称应该是自我记录的,它们是。如果用较少的代码使方法更清晰,为什么要写更多?

我的意思是,为什么我们需要在接口部分命名方法参数,而不仅仅是在实现中?

4 个答案:

答案 0 :(得分:7)

您不能声明没有参数名称的方法,因为在这种情况下,编译器无法判断类型后面的下一个标记是参数名称还是方法名称的一部分。让我在这个例子中演示它:

-(void)testMethodWithParam:(int)a secondParam:(int)b;

这是一个正确的方法声明。现在让我们按照你的建议进行编辑:

-(void)testMethodWithParam:(int) secondParam:(int);

对我们来说,我们的意思非常明显。我们可以说,secondParam:显然是方法名称的一部分。但是Objective-C允许我们在这样的空格之后写一个列:

-(void)testMethodWithParam:(int) secondParam :(int);

这种情况(从我的观点来看)不再那么清楚了。特别是如果我们再删除一个空间:

-(void)testMethodWithParam:(int)secondParam :(int);

现在看起来secondParam是第一个参数的名称,并且缺少方法名称的一部分。 我想,为了使这些问题更容易解决,Objective-C让我们编写了一个完整的方法规范。 我认为,他们可以稍微改变一下方法声明格式,以便它允许这样的声明(我喜欢你的想法),但现在就是这样。

但是,您可以在@interface@implementation中使用不同的变量名称。所以这个:

@interface TestClass : NSObject
-(void)testMethodWithParam:(int)a secondParam:(int)b;
@end

@implementation TestClass
-(void)testMethodWithParam:(int)firstParam secondParam:(int)secondParam
{...}
@end

是合法的。

P.S。顺便说一句,在这种情况下,@ CodaFi使用下划线作为变量名称的想法可能很好:

@interface TestClass : NSObject
-(void)testMethodWithParam:(int)_ secondParam:(int)_;
@end

有趣的是它编译,尽管我对这两个变量名都使用了一个下划线。

答案 1 :(得分:1)

因为那时你无法访问参数的值。 methodNametagpath名称是存储参数的变量。您的第一个示例类似于someMethodWithNametagpath(NSString *name, int tag, NSURL *path)之类的C函数,而您的第二个示例是someMethodWithNametagpath(NSString*, int, NSUrl*)

答案 2 :(得分:1)

我能想到的一个原因是消除歧义:

// A method named someMethodWithName:::
- (void)someMethodWithName:(NSString *) methodName :(NSUInteger) tag :(NSURL *)path;    

看起来非常接近你的建议:

- (void)someMethodWithName:(NSString *) tag:(NSUInteger) path:(NSURL *);

答案 3 :(得分:0)

通过问题回答您的问题,编译器如何知道示例中变量的名称是methodName?我个人认为这将是name。编译器是如何神奇地省略“with”的?您的假设Objective-C编译器是否配备了一些语言解析技术,使其能够理解英语?如果我的母语是西班牙语怎么办?

此外,这个方法怎么样:

 -(void)someMethodWithName: (NSString*) anotherMethodWithName: (NSString*);

第二个变量的名称是什么? anotherMethodName?编译器如何知道省略with但保存another

如果您有ivar名为“methodName”怎么办?现在,您必须在直观命名的方法和直观命名的ivar之间进行选择。

现在,Objective-C的初学者必须学习一整套规则,以便从消息名称中找出变量名。更糟糕的是,用于生成参数名称的规则集可能过于复杂而无法放入规范中,并且必须由语言的实现者来决定。现在,根据您的编译器,可能存在几个不同的命名约定集。