Me encuentro con un escenario bastante común en Objective-C donde paso una variable a un método init y luego quiero asignarlo a una variable de instancia del mismo nombre. Sin embargo, no he encontrado una forma de delimitar las variables para aclarar cuál es el valor del argumento del mensaje y cuál es la variable de instancia.Buena práctica para desambiguar nombres de argumento versus nombres de variable de instancia en Objective-C
Decir que tengo un poco de clase tales como los siguientes:
@interface MyObject
{
NSString *value;
}
- (id)initWithValue:(NSString *)value;
@end
En mi aplicación Quiero que mi método init para mirar algo como esto:
- (id)initWithValue:(NSString *)value
{
self = [super init];
if(self) {
self.value = value; // This will not work with instance variables
}
}
Sé de tres soluciones:
- Crear una propiedad que permite llamar
self.value
- cambiar el nombre de variable de instancia, como
_value
- cambiar el nombre de la variable argumento init, como
initValue
oargValue
no estoy satisfecho con cualquiera de estas soluciones. Agregar una propiedad hace que la propiedad esté disponible públicamente en la interfaz o, si utilizo una extensión, la oculta de los herederos. Tampoco me gusta tener diferentes nombres para las variables o usar un guión bajo, que tal vez proviene del desarrollo en otros lenguajes como Java y C#.
¿Hay alguna manera de eliminar la ambigüedad de las variables de instancia de los argumentos del mensaje? Si no, ¿hay una pauta de codificación en Cocoa para la forma de resolver este problema? Me gusta seguir las pautas de estilo cuando sea apropiado.
actualización
Después de pensar acerca de cómo hacer esto en C, se me ocurrió la solución de self->value
. Esto funciona, pero produce un compilador que advierte que la declaración local de 'valor' oculta la variable de instancia. Así que esta tampoco es una solución satisfactoria ya que tengo un objetivo de advertencia cero.
Uso 'crunkIn' porque de lo contrario no obtendrá autocompletar. –
@Josh Caswell, por coherencia es la convención de usar el prefijo que elija (nuevo, el, a) en todos los casos, incluso si no lo asigna? Tal vez simplemente se pasa a otro mensaje, como '[super setCrunk:]' –
@DavidV: Diría que dejo el prefijo a menos que sea necesario desambiguar con un ivar, pero no puedo pretender que sea otra cosa que mi preferencia. –