【问题标题】:struggling with correct way to name this method努力以正确的方式命名此方法
【发布时间】:2010-11-14 16:55:30
【问题描述】:

长期从事 c#/java/c++ 程序员,刚接触 objectivce C 的品牌。阅读指南,查看 api,但在命名约定方面还不完全。

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

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

感谢所有意见!花了太多时间思考这个问题。

选项 A) -(NSArray *) getCarsWithColor:(NSString *)color;

选项 B) -(NSArray *) getCars:(NSString *)withColor;

Optoin C) -(NSArray *) carsWithColor:(NSString *)color;

选项 D) -(NSArray *) cars:(NSString *)withColor;

选项 E) 以上都不是,将其命名为 xxxxxxxxxxxx....

谢谢。

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

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

    -(void)getObjects:(id*)aBuffer;
      ^^^^                 ^^^^^^^
    

    而您的方法不是填充缓冲区,而是返回一个数组。选项 (A) 和 (B) 已取消。

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

    -(UIView*)viewWithTag:(NSInteger)tag
                  ^^^^^^^
    // not view:(NSInteger)withTag
    
    -(CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view
    // not convert:(CGPoint)point from:(UIView*)view;
    

    因此不鼓励使用选项 (D)。

    可以在Coding Guidelines for Cocoa: Naming Methods 中找到命名方法的详细指南。本指南还包括您可能感兴趣的其他约定。

    【讨论】:

      【解决方案2】:

      选项 C 是最好的。除非您要获取指向 C 数组的指针并且参数只能以引用它们的方法签名来命名,否则切勿使用“get”。

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

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

      ...向他人描述时可以缩写为:-carsWithColor:wheels:seats:premiumInterior:...

      【讨论】:

        【解决方案3】:

        “C”是执行此操作的标准方式。 get 在 getter 中很少使用,更详细的 carsWithColor 是首选。

        【讨论】:

          【解决方案4】:

          除了其他人所说的之外,我很好奇您为什么要在 Cars 类中存储一个 NSArray 对象。在我看来,汽车是一个包含汽车类实例的 NS[Mutable]Array ivar。那么,你根本不需要这个方法。如果您使用的是 Core Data,那么您将进行 fetch,如果您只是自己处理 NSArray,则可以使用谓词来过滤数组的对象。我认为这是你的问题中最让我印象深刻的一点。如果您确实需要此方法,那么它将在包含 NSArray ivar 的对象上定义,例如:

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

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

          【讨论】:

          • +1 这是一个很好的观点。为什么类本身会跟踪实例?
          • 感谢关于谓词的输入。我是 C# 中扩展方法的忠实粉丝,并且谓词似乎提供了相同的功能。我在汽车上的示例是即时制作的,以展示我对如何命名方法的困惑。
          【解决方案5】:

          Objective-C 方法名称不使用get 前缀。所以选项 C 最接近正确,但需要注意的是 aWithB 构造意味着返回的 NSArray * 将是 autorelease-d。

          【讨论】:

            【解决方案6】:

            哦,有很多方法可以做你想做的事!通常,除非您定义自定义 getter,否则应避免使用“get...”表示法,以避免混淆。我投票给选项 C,“-(NSArray *) carsWithColor:(NSString *)color;”。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-06-18
              • 1970-01-01
              • 1970-01-01
              • 2017-04-13
              • 1970-01-01
              • 1970-01-01
              • 2011-09-09
              • 2021-11-09
              相关资源
              最近更新 更多