当前位置:  开发笔记 > IOS > 正文

你如何命名实例/参数值?

如何解决《你如何命名实例/参数值?》经验,为你挑选了2个好方法。

作为Objective-C(但是长期的C/++)程序员的新手,我正在寻找有关变量命名约定的建议/建议.

我个人的偏好是为实例中的清晰度使用前缀作为实例变量,并防止功能参数的阴影.然而,我是排除前缀的属性的粉丝(除非你也为你的属性名称添加前缀,这不是很好,看起来很糟糕).同样地,我可以使用"self.variable"约定,但前提是我将一切都设为属性.

所以给定下面的代码你的首选实例/函数变量的命名风格是什么?如果你不打扰,你如何处理函数参数的阴影?

@interface GridItem : NSObject
{
    CGRect _rect;
    ...  
}
@end

-(void) initFromRect:(CGRect)rect
{
    _rect = rect;
    ...
}

干杯!



1> Chris Hanson..:

大多数Cocoa项目使用underbar作为非IBOutlet实例变量前缀,并且不为IBOutlet实例变量使用前缀.

我不使用underbars作为IBOutlet实例变量的原因是,当加载nib文件时,如果你有一个连接插座的setter方法,那么将调用该setter. 但是这种机制并没有使用键-值编码,所以一个IBOutlet,其名称的前缀以底线(例如 _myField)将不会设置,除非二传手名为酷似出口(例如 set_myField:),这是非标准和严重.

此外,请注意使用属性喜欢self.myProp一样的访问实例变量.您在使用属性时发送消息,就像使用括号表示法一样[self myProp].所有属性都为您提供了一个简洁的语法,用于在一行中指定getter和setter,并允许您合成它们的实现; 它们实际上并没有使消息调度机制短路.如果你想直接访问一个实例变量但是在它前面加上self你需要把它self当作一个指针,就像self->myProp一个C风格的字段访问一样.

最后,在编写Cocoa代码时不要使用匈牙利符号,并回避其他前缀如"f"和"m_" - 这会将代码标记为由没有"得到它"的人编写并将导致它被其他Cocoa开发者怀疑.

通常,请遵循Apple Developer Connection中的Cocoa编码指南文档中的建议,其他开发人员将能够学习和理解您的代码,并且您的代码将适用于使用运行时内省的所有Cocoa功能.

以下是使用我的约定的窗口控制器类的外观:

// EmployeeWindowController.h
#import 

@interface EmployeeWindowController : NSWindowController {
@private
    // model object this window is presenting
    Employee *_employee;

    // outlets connected to views in the window
    IBOutlet NSTextField *nameField;
    IBOutlet NSTextField *titleField;
}

- (id)initWithEmployee:(Employee *)employee;

@property(readwrite, retain) Employee *employee;

@end

// EmployeeWindowController.m
#import "EmployeeWindowController.h"

@implementation EmployeeWindowController

@synthesize employee = _employee;

- (id)initWithEmployee:(Employee *)employee {
    if (self = [super initWithWindowNibName:@"Employee"]) {
        _employee = [employee retain];
    }
    return self;
}

- (void)dealloc {
    [_employee release];

    [super dealloc];
}

- (void)windowDidLoad {
    // populates the window's controls, not necessary if using bindings
    [nameField setStringValue:self.employee.name];
    [titleField setStringValue:self.employee.title];
}

@end

你会看到,我使用的是引用的实例变量Employee直接在我-init-dealloc方法,而我使用的其他方法的属性.这通常是一个具有属性的良好模式:只触摸初始化-dealloc器中的属性的基础实例变量,以及属性的getter和setter中的属性.



2> Dave Dribin..:

我遵循Chris Hanson关于下划线ivar前缀的建议,但我承认我也使用下划线来表示IBOutlets.但是,根据@ mmalc的建议,我最近开始将我的IBOutlet声明移到@property线上.好处是我的所有ivars现在都有一个下划线和标准的KVC设置器被称为(即).此外,插座名称在Interface Builder中没有下划线.setNameField:

@interface EmployeeWindowController : NSWindowController {
@private
    // model object this window is presenting
    Employee *_employee;

    // outlets connected to views in the window
    NSTextField *_nameField;
    NSTextField *_titleField;
}

- (id)initWithEmployee:(Employee *)employee;

@property(readwrite, retain) Employee *employee;
@property(nonatomic, retain) IBOutlet NSTextField *nameField;
@property(nonatomic, retain) IBOutlet NSTextField *titleField;

@end

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有