Prefijar nombres de propiedades con un guión bajo en Objective C [duplicado]
Anteriormente he evitado los guiones bajos en los nombres de mis variables, quizás un vestigio de mis días universitarios en Java. Entonces, cuando defino una propiedad en Objective C, esto es lo que hago naturalmente.
// In the header
@interface Whatever
{
NSString *myStringProperty
}
@property (nonatomic, copy) NSString *myStringProperty;
// In the implementation
@synthesize myStringProperty;
Pero en casi todos los ejemplos se hace como
// In the header
@interface Whatever
{
NSString *_myStringProperty
}
@property (nonatomic, copy) NSString *myStringProperty;
// In the implementation
@synthesize myStringProperty = _myStringProperty;
¿Debería superar mi aversión al guión bajo porque esa es la única forma en que debe hacerse? ¿Existe una buena razón para que este estilo sea el preferido?
Actualización: hoy en día, con la síntesis automática de propiedades, puedes omitir @synthesize y el resultado es el mismo que si hubieras usado
@synthesize myStringProperty = _myStringProperty;
lo que muestra claramente la preferencia de Apple. Desde entonces, aprendí a dejar de preocuparme y a amar el guión bajo.
Siempre uso guiones bajos. Crea una distinción clara entre variables locales y variables de instancia. También evita advertencias del compilador en la siguiente situación:
@interface MyClass
{
NSString *name
}
@property (nonatomic, copy) NSString *name;
- (id) initWithName:(NSString *) name;
@end
@implementation MyClass
@synthesize name;
// The following method will result in a compiler warning
// (parameter name same as ivar name)
- (id) initWithName:(NSString *) name {
if (self = [super init]) {
self.name = name;
}
return self;
}
@end
EDITAR :
Después de tener que soportar votos negativos y leer los comentarios, permítanme intentar aclarar mi punto:
Apple recomienda que los ivars tengan el mismo nombre que su propiedad. Apple también recomienda que las propiedades comiencen con una letra minúscula. Y Apple también recomienda que las variables locales comiencen con una letra minúscula.
Ahora tienes un problema, porque cuando lees un fragmento de código y ves que se está utilizando una variable, no puedes saber por la convención de nomenclatura si esta variable es un ivar o una variable local. Eso apesta. La solución es tener diferentes convenciones de nomenclatura para ivars y variables locales. Eso es simplemente sentido común.
La forma en que implemente esta convención de nomenclatura es irrelevante. Si realmente lo desea, simplemente puede agregar "_WOOHAHA" a los nombres de ivar. No me importa (pero tal vez a otros sí les importe). La cuestión es que las personas que saben lo que están haciendo han decidido utilizar el "prefijo de guión bajo" para ivars. En mi humilde opinión, tomaron la decisión correcta, incluso si su propia empresa recomienda algo más. (Los desarrolladores de los que hablo son las personas que escriben algunos de los principales frameworks de Apple y las clases de .NET Framework)
Al final, la calidad del código es más importante que seguir una regla estúpida que ni siquiera sigue la gente que la predica.
Otra observación sobre el código que ha mostrado: nunca use retener en propiedades de cadena. Deberías usar copiar en su lugar.
Para obtener más información sobre copiar/retener propiedades, consulte:
Propiedad NSString: ¿copiar o conservar?
Apple ahora establece claramente la convención de nomenclatura para la variable de instancia con el prefijo _ en las "Pautas de codificación para Cocoa", después de la revisión del 16 de febrero de 2012, con su motivo.
Asegúrese de que el nombre de la variable de instancia describa de manera concisa el atributo almacenado. Por lo general, no debe acceder a las variables de instancia directamente, sino que debe usar métodos de acceso (accede a las variables de instancia directamente en los métodos init y dealloc). Para ayudar a señalar esto, anteponga los nombres de las variables de instancia con un guión bajo (_), por ejemplo:
@implementation MyClass {
BOOL _showsTitle;
}
Si sintetiza la variable de instancia utilizando una propiedad declarada, especifique el nombre de la variable de instancia en la declaración @synthesize.
@implementation MyClass
@synthesize showsTitle=_showsTitle;
https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingIvarsAndTypes.html#//apple_ref/doc/uid/20001284-BAJGIIJE
La conferencia en iTunes U, iPhone App Development CS193p Fall 2011 impartida por Paul Hegarty en la Universidad de Stanford, también explica esta convención.
http://itunes.apple.com/itunes-u/ipad-iphone-application-development/id473757255
Soy consciente de que esta pregunta se hizo hace bastante tiempo, pero yo mismo tenía la misma pregunta y quería compartir mis hallazgos.