Objective C:如何在iOS中审查代码

4

我是Stack Overflow的新用户,同时也是一名iOS开发者。我想知道如何审查我们的代码?

编程中有哪些命名规范?变量名、类名的指导方针是什么?如何管理这些规范?


它将遵循与99%的编程语言相同的约定。我不太确定你所说的“我们如何管理这个?”是什么意思。 - jbutler483
基本的命名规则与C/C++/Java相同:类名首字母大写,变量名首字母小写,#define名称全部大写。常量和枚举的命名约定尚未确定。 - Hot Licks
@jbutler483 - 微软(当然)使用自己的C风格语言约定,而非C风格语言往往也不同,因此它与“所有编程语言一样”并不相同。 - Hot Licks
1
有关命名规范,请参阅Cocoa编码指南 - Rob
2个回答

5
苹果公司制定了一系列准则,规定代码应该如何编写以实现最大的清晰度和与框架的集成。此外,Cocoa开发人员经常使用一些未记录的约定。
类名: 1. 类名总是大写。 2. 因为Objective-C没有命名空间,所以请在类名前加上首字母缩写。这可以避免“命名空间冲突”的情况,即两个代码片段具有相同的名称但执行不同的功能。由Cocoa Dev Central创建的类可能会加上“CDC”前缀。 3. 如果您要对标准Cocoa类进行子类化,则最好将前缀与超类名称结合起来,例如CDCTableView。
变量名:
  1. Variable names start with lower-case letters, but are internally capitalized wherever a new word appears:

     NSString * streetAddress  = @"1 Infinite Loop";
     NSString * cityName       = @"Cupertino";
     NSString * countyName     = @"Santa Clara";
    

--------- 正确方式 ---------

     NSString       * hostName;
     NSNumber       * ipAddress;
     NSArray        * accounts;

--------- 不正确的方式 ---------

     NSString       * HST_NM;      // all caps and too terse
     NSNumber       * theip;       // a word or abbreviation?
     NSMutableArray * nsma;        // completely ambiguous
  1. Variables can't start with a number, no spaces, no special characters other than underscores.

  2. Apple discourages using an underscore as a prefix for a private instance variable.

     NSString * name    // correct!
     NSString * _name   // _incorrect_
    

变量名:指示类型

  1. 在实际应用中,如果变量名是像NSString、NSArray、NSNumber或BOOL这样的常见类型,则通常不会指示其类型。

正确写法

     NSString       * accountName;
     NSMutableArray * mailboxes;
     NSArray        * defaultHeaders;
     BOOL             userInputWasUpdated;

还行,但不是最理想的

     NSString       * accountNameString;
     NSMutableArray * mailboxArray;
     NSArray        * defaultHeadersArray;
     BOOL             userInputWasUpdatedBOOL;
  1. 如果变量不是这些类型之一,变量名应该反映出来。此外,有些类只需要一个实例。在这种情况下,只需根据类名命名变量即可。字体管理器就是一个很好的例子。

何时指示类型

     NSImage             * previewPaneImage;  // self-explanatory
     NSProgressIndicator * uploadIndicator;   // shows progress for uploads
     NSFontManager       * fontManager;       // only one of these, basic name ok

方法名

  1. 方法可能是我们可以谈论的最重要的主题。大多数面向对象语言使用一种语法。

  2. 虽然这些方法名称在第一次写入时很容易,但实际行为并不清晰。在大量周围代码的情况下,这是更大的问题。

  3. Cocoa程序员从最终效果出发思考,选择一个基于实际使用情况的方法名。假设我想编写一个写入磁盘的内存中文件对象。

在Cocoa/Objective-C中,它看起来像这样:

    [fileWrapper writeToFile: path atomically: YES updateFilenames: YES];

方法名称:访问器

  1. 与许多其他语言不同,Objective-C 不鼓励在简单访问器上使用 "get" 前缀。实例变量和方法可以具有相同的名称,因此应该利用这一点:

正确!

      - (NSString *) name;
      - (NSString *) color;

      name  = [object name];
      color = [object color];

错误的

      - (NSString *) getName;
      - (NSColor  *) getColor;

      name  = [object getName];
      color = [object getColor];
  • 然而,在通过内存地址间接返回值的情况下,通常会使用“get”前缀:
  • 何时使用“Get”前缀

    // 将对象从NSArray复制到缓冲区

          id *buffer = (id *) malloc(sizeof(id) * [array count]);
          [array getObjects: buffer];
          ( Don't worry if you don't know what malloc does. )
          The "set" prefix is always used on setters, though:
    
    
          [object setName:  name];
          [object setColor: color];
    

    形容词

    1. Not all accessors return values like name, date, height, etc. Some represent a particularly quality of an object. These are often represented by BOOLs.

    2. For example, "selectable". In Objective-C, the getter for this key is called -isSelectable, but the setter is -setSelectable:

          BOOL selectable = [textView isSelectable];
          BOOL editable   = [textView isEditable];
      
          [textView setSelectable: YES];    // no "is"
          [textView setEditable:   YES];    // no "is"
      
           // if textview is editable.
      
          if ([textView isEditable])
          [textView setEditable: NO];
      
    3. Keep in mind that naming your accessors according to all of these rules isn't purely an issue of clarity and aesthetics. Cocoa relies heavily on KVC for much of its magic, and KVC relies on properly-named accessors.

    我认为这会对你有所帮助。

    2
    “Apple不鼓励在私有实例变量前使用下划线作为前缀。”这并不正确。当使用支持属性的实例变量时,正是应该使用下划线的时候。 - Rob
    在类别方面,我注意到你错过了一件事情。类别文件的命名约定应该类似于 CDCTableView+CategoryName.h,其中 CategoryName 是你创建的类别的名称。同时我也同意 Rob 的看法,这也是为什么我要求文档的原因。 - Popeye
    1
    Re前缀用于ivars,下划线_推荐用于支持属性的ivars。根据《Cocoa编码指南》中的Declared Properties and Instance Variables:“通常,您不应直接访问实例变量;而应使用访问器方法(您可以在init和dealloc方法中直接访问实例变量)。为了帮助表示这一点,请使用下划线(_)作为实例变量名称的前缀...” - Rob
    是的。对此感到抱歉。但是如果我使用属性synthesize声明一个变量,然后忘记合成该变量。这时苹果会自动发出警告并提示(_)。 - Soumya Ranjan
    是的,如果您未明确使用@synthesize,编译器会默认生成一个使用前导下划线的ivar,并在您意外添加不带下划线的自定义ivar时提出警告。如果添加下划线,则该警告将消失。这种行为(以及我之前提供的文档参考)表明声称“Apple不鼓励在私有实例变量的前缀中使用下划线”是不正确的。恰恰相反,他们建议在某些情况下应该这样做(并且默认情况下会这样做)。 - Rob
    显示剩余2条评论


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接