目标 C:如何在 iOS 中审查代码

Dee*_*ika 4 iphone objective-c ios swift

我是堆栈溢出的新用户,我也是 iOS 开发人员。我想知道如何查看我们的代码?

通过编码的命名约定是什么?变量名、类名的指导原则是什么。我们如何管理这个?

S R*_*yak 5

Apple 制定了一套关于如何编写代码以实现最大清晰度和与框架集成的指南。此外,还有一些 Cocoa 开发人员经常使用的未记录的约定。

班级名称:

  1. 类名总是大写。

  2. Objective-C没有命名空间,所以在你的类名前加上首字母。这避免了“命名空间冲突”,即两段代码具有相同名称但执行不同操作的情况。Cocoa Dev Central创建的类可能会以“ CDC ”为前缀。

  3. 如果您对标准 Cocoa 类进行子类化,最好将您的前缀与超类名称结合起来,例如CDCTableView

变量名称:

  1. 变量名以小写字母开头,但在出现新词的地方内部大写:

     NSString * streetAddress  = @"1 Infinite Loop";
     NSString * cityName       = @"Cupertino";
     NSString * countyName     = @"Santa Clara";
    
    Run Code Online (Sandbox Code Playgroud)

---------正确方法---------

     NSString       * hostName;
     NSNumber       * ipAddress;
     NSArray        * accounts;
Run Code Online (Sandbox Code Playgroud)

---------错误的方式---------

     NSString       * HST_NM;      // all caps and too terse
     NSNumber       * theip;       // a word or abbreviation?
     NSMutableArray * nsma;        // completely ambiguous
Run Code Online (Sandbox Code Playgroud)
  1. 变量不能以数字开头,不能有空格,不能有除下划线以外的特殊字符。

  2. Apple 不鼓励使用下划线作为私有实例变量的前缀。

     NSString * name    // correct!
     NSString * _name   // _incorrect_
    
    Run Code Online (Sandbox Code Playgroud)

变量名称:指示类型

  1. 就现实世界的实践而言,如果变量名称是常见的,如 NSString、NSArray、NSNumber 或 BOOL,则它通常不指示类型。

正确的

     NSString       * accountName;
     NSMutableArray * mailboxes;
     NSArray        * defaultHeaders;
     BOOL             userInputWasUpdated;
Run Code Online (Sandbox Code Playgroud)

好的,但不理想

     NSString       * accountNameString;
     NSMutableArray * mailboxArray;
     NSArray        * defaultHeadersArray;
     BOOL             userInputWasUpdatedBOOL;
Run Code Online (Sandbox Code Playgroud)
  1. 如果变量不是这些类型之一,则名称应反映它。此外,有些类您只需要一个实例。在这种情况下,只需根据类名命名变量。字体管理器就是一个很好的例子。

何时指明类型

     NSImage             * previewPaneImage;  // self-explanatory
     NSProgressIndicator * uploadIndicator;   // shows progress for uploads
     NSFontManager       * fontManager;       // only one of these, basic name ok
Run Code Online (Sandbox Code Playgroud)

方法名称

  1. 方法也许是我们可以谈论的最重要的话题。大多数面向对象的语言都使用语法。

  2. 虽然这些方法名称在第一次编写时很容易,但实际行为尚不清楚。在大量的周围代码中,这更像是一个问题。

  3. Cocoa 程序员从最后考虑,根据实际使用中的外观来选择方法名称。假设我想写一个写入磁盘的内存文件对象。

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

    [fileWrapper writeToFile: path atomically: YES updateFilenames: YES];
Run Code Online (Sandbox Code Playgroud)

方法名称:访问器

  1. 与许多其他语言相比,Objective-C 不鼓励在简单访问器上使用“get”前缀。实例变量和方法可以具有相同的名称,因此请充分利用它:

正确的!

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

      name  = [object name];
      color = [object color];
Run Code Online (Sandbox Code Playgroud)

不正确

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

      name  = [object getName];
      color = [object getColor];
Run Code Online (Sandbox Code Playgroud)
  1. 但是,“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];
Run Code Online (Sandbox Code Playgroud)

形容词

  1. 并非所有访问器都返回名称、日期、高度等值。有些访问器表示对象的特定质量。这些通常由BOOL表示。

  2. 例如,“可选”。在 Objective-C 中,这个键的 getter 被称为 -isSelectable,但 setter 是 -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];
    
    Run Code Online (Sandbox Code Playgroud)
  3. 请记住,根据所有这些规则命名您的访问者不仅仅是一个清晰和美观的问题。Cocoa的大部分魔法在很大程度上依赖于KVC,而 KVC 依赖于正确命名的访问器。

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

  • “Apple 不鼓励使用下划线作为私有实例变量的前缀”。不对。当使用支持属性的实例变量时,这正是您应该使用下划线的时候。 (2认同)