以下人们对实例变量和方法参数的命名有什么约定 - 特别是当使用方法参数来设置ivars(实例变量)时?
在C++中,我过去经常使用m_
ivars 的前缀.在C#中,我遵循了纯粹使用this.
ivars 消除歧义的惯例.我已经采用了C++中的等价物(this->
).
在目标C中我尝试了一些事情,但没有一个真的令人满意.
除非有人建议一些非常好的东西,否则我将不得不妥协(但请不要让我使用the
args 的前缀!),所以我很想听听大多数人说的话 - 尤其是来自那些一直使用ObjC的人.
在发布这个之前我做了一些尽职调查,并且发现了一些很好的资源:
这个风格指南(简要提到我的主题)
这个帖子(那里有很多ex C++编码器)
他们给了我一些想法,但我仍然渴望听到别人在做什么.
[编辑]只是为了澄清:具体是你如何区分我正在寻找的方法和方法 - 无论是通过前缀还是其他技术.
[编辑2]感谢所有的回复和讨论要点.我不是要关闭这个,但只是说,正如我在评论中指出的那样,我接受了使用init args前缀的惯例the
(以及setter args with new
,无论如何我都在做).这似乎是力量的最佳平衡 - 即使我自己并不热衷于审美.
正如您所指出的,Cocoa样式是使用方法参数名称,theValue
如果参数名称将与实例变量冲突.然而,在Objective-C 2.0样式代码中出现这种情况不应该多次.假设你不应该(通常)直接访问实例变量.这主要是因为这样做可以绕过Cocoa中的Key-Value Observing机制.相反,期望您将通过getter/setter方法访问和改变属性.在Objective-C 2.0中,很容易声明这些属性并自动声明@synthesize
getter/setter,因此没有多少借口不使用它们.事实上,在64位系统上,运行时将自动为您创建实例变量,从而无需声明它们并减少使用它们的冲动.
您应该直接访问实例变量的唯一时间是-init
和-dealloc
方法:
@interface MyObject : NSObject { id ivar; } @property (retain,readwrite) id ivar; //or whatever retain/copy/assign and read/readwrite makes sense @end @implementation MyObject @synthesize ivar; - (id)initWithIvar:(id)theIvar { if(self = [super init]) { ivar = theIvar; } return self; } - (void)dealloc { [ivar release]; }
所述的ivar应直接在这些情况下所使用的原因是怎么一回事,因为吸气剂/调节器可具有副作用,取决于完全初始化实例,从而使它们在危险-init
和-dealloc
在对象的状态被完全初始化.在所有其他情况下,您应该使用self.ivar
(或[self ivar]
和[self setIvar:newValue]
).
似乎除了-initWithXX
不应该有命名冲突的方法.如果他们这样做,他们不应该重构不具有该参数或者Class不具有实例变量吗?
这就留下了-initWithXX
经常在参数和ivars之间发现冲突的方法.对于这种情况,如果你真的无法忍受Cocoa风格,你可以使用你提到的任何方法.使用_
作品进行前缀并且相对常见(我相信@synthesize
'd setter和getters在这种情况下会自动做正确的事情,但您可能必须明确地将其设置_ivar
为支持).