Iphone 正在努力以正确的方式命名此方法

Iphone 正在努力以正确的方式命名此方法,iphone,objective-c,Iphone,Objective C,长期从事c#/java/c++程序员,ObjectiveCE c新手。阅读指南,查看api,但还不完全了解命名约定 示例:假设我有一个Cars类,它包含每个car的数组,并且您希望方法返回数组的子集 我看到NSArray有一个方法:getObjects,但在大多数情况下,我看不到“get”。所以 你喜欢什么 感谢所有的投入花了太多时间思考这个问题 选项A)-(NSArray*)getCarsWithColor:(NSString*)颜色 选项B)-(NSArray*)getCars:(NSStr

长期从事c#/java/c++程序员,ObjectiveCE c新手。阅读指南,查看api,但还不完全了解命名约定

示例:假设我有一个Cars类,它包含每个car的数组,并且您希望方法返回数组的子集

我看到NSArray有一个方法:getObjects,但在大多数情况下,我看不到“get”。所以 你喜欢什么

感谢所有的投入花了太多时间思考这个问题

选项A)-(NSArray*)getCarsWithColor:(NSString*)颜色

选项B)-(NSArray*)getCars:(NSString*)带颜色

Optoin C)-(NSArray*)carsWithColor:(NSString*)颜色

选项D)-(NSArray*)车辆:(NSString*)带颜色

选项E)以上无一项,将其命名为XXXXXXXXXX


谢谢。

Objective-C方法很少用
get
命名。
getObjects:
方法中有
get
,这仅仅是因为结果放在输入参数的缓冲区中

-(void)getObjects:(id*)aBuffer;
  ^^^^                 ^^^^^^^
而您的方法不是填充缓冲区,而是返回一个数组。选项(A)和(B)不适用

此外,参数的类型通常是选择器名称的一部分(前面的内容::),例如

因此,不鼓励选择(D)


有关命名方法的详细指南,请参见。本指南还包括您可能感兴趣的其他约定。

选项C是最好的。永远不要使用“get”,除非你要把指针放到一个C数组中,并且参数应该只根据引用它们的方法签名命名

这样,具有多个参数的较长方法更清晰:

-(NSArray *)carsWithColor:(NSColor *)color 
                   wheels:(NSInteger)wheels 
                    seats:(NSInteger)seats 
          premiumInterior:(BOOL)premiumInterior ...

…在向他人描述时,可缩短为:
-carsWithColor:wheels:seats:premiumniterior:…

Objective-C方法名称不使用
get
前缀。因此,选项C最接近正确,需要注意的是,
aWithB
结构意味着返回的
NSArray*
将是
自动释放
-d.

“C”是标准的方法<代码>获取在getter中很少使用,更详细的
carsWithColor
是首选。

哦,有很多方法可以完成你想做的事情!通常,除非定义自定义getter,否则应该避免使用“get…”符号,以避免混淆。我投票支持选项C,“-(NSArray*)carsWithColor:(NSString*)color;”

除了其他人所说的,我很好奇为什么要在Cars类中存储对象的NSArray。在我看来,cars是一个NS[Mutable]数组ivar,其中包含car类的实例。那么,你根本不需要这个方法。如果您使用的是核心数据,那么您将进行一次获取,如果您只是自己处理NSArray,那么您可以使用谓词来过滤数组的对象。我认为这是你问题中最不符合可可的方面。如果确实需要此方法,则将在包含NSArray ivar的对象上定义此方法,如:

NSArray *cars = [NSArray arrayWithObjects:car1, car2, car3, nil];
(NSArray *)carsWithColor:(NSString *)color{
    return [cars filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"color == %@", color]];
}

该代码未经测试,但这是我解决问题的方法。该方法实际上是一种控制器类型的方法,不应该是模型逻辑的一部分。对我来说,拥有汽车类课程听起来像是糊涂的MVC。

+1这是一个伟大的观点。为什么类本身会跟踪实例?感谢您对谓词的输入。我非常喜欢c#中的扩展方法,谓词似乎也提供了相同的功能。我在cars上的示例是动态编写的,以演示我对如何命名方法的困惑。
NSArray *cars = [NSArray arrayWithObjects:car1, car2, car3, nil];
(NSArray *)carsWithColor:(NSString *)color{
    return [cars filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"color == %@", color]];
}