作为Objective-C(但是长期的C/++)程序员的新手,我正在寻找有关变量命名约定的建议/建议.
我个人的偏好是为实例中的清晰度使用前缀作为实例变量,并防止功能参数的阴影.然而,我是排除前缀的属性的粉丝(除非你也为你的属性名称添加前缀,这不是很好,看起来很糟糕).同样地,我可以使用"self.variable"约定,但前提是我将一切都设为属性.
所以给定下面的代码你的首选实例/函数变量的命名风格是什么?如果你不打扰,你如何处理函数参数的阴影?
@interface GridItem : NSObject
{
CGRect _rect;
...
}
@end
-(void) initFromRect:(CGRect)rect
{
_rect = rect;
...
}
Run Code Online (Sandbox Code Playgroud)
干杯!
Chr*_*son 15
大多数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 <AppKit/NSWindowController.h>
@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
Run Code Online (Sandbox Code Playgroud)
你会看到,我使用的是引用的实例变量Employee直接在我-init和-dealloc方法,而我使用的其他方法的属性.这通常是一个具有属性的良好模式:只触摸初始化-dealloc器中的属性的基础实例变量,以及属性的getter和setter中的属性.
我遵循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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3018 次 |
| 最近记录: |