Decir que tengo una clase como esta:¿Debo usar propiedades o referencia directa cuando acceda a variables de instancia internamente?
@interface MyAwesomeClass : NSObject
{
@private
NSString *thing1;
NSString *thing2;
}
@property (retain) NSString *thing1;
@property (retain) NSString *thing2;
@end
@implementation MyAwesomeClass
@synthesize thing1, thing1;
@end
Al acceder thing1
y thing2
internamente (es decir, dentro de la implementación de MyAwesomeClass
), es mejor utilizar la propiedad, o simplemente hacer referencia a la variable de instancia directamente (suponiendo casos en los que no hacemos ningún trabajo en un acceso "personalizado" o mutador, es decir, simplemente establecemos y obtenemos la variable). Pre-Objective C 2.0, usualmente solo accedemos a los ivars directamente, pero ¿cuál es el estilo de codificación/mejores prácticas usuales ahora? ¿Y esta recomendación cambia si una variable/propiedad de instancia es privada y no se puede acceder fuera de la clase? ¿Debes crear una propiedad para cada ivar, incluso si son privados, o solo para datos públicos? ¿Qué pasa si mi aplicación no utiliza las características de codificación de valor clave (ya que KVC solo activa el acceso a la propiedad)?
Me interesa mirar más allá de los detalles técnicos de bajo nivel. Por ejemplo, dada (sub-óptimo) código como:
@interface MyAwesomeClass : NSObject
{
id myObj;
}
@proprety id myObj;
@end
@implementation MyAwesomeClass
@synthesize myObj;
@end
Sé que myObj = anotherObject
es funcionalmente el mismo que self.myObj = anotherObj
.
Pero las propiedades no son simplemente una sintaxis sofisticada para instruir al compilador para que cree accesos y mutadores para usted, por supuesto; también son una forma de encapsular mejor los datos, es decir, puede cambiar la implementación interna de la clase sin reescribir las clases que dependen de esas propiedades. Me interesan las respuestas que abordan la importancia de este problema de encapsulación cuando se trata del código interno de la clase. Además, las propiedades escritas adecuadamente pueden disparar las notificaciones de KVC, pero el acceso directo de ivar no; ¿Importa esto si mi aplicación no está utilizando las características de KVC ahora, por si acaso podría en el futuro?
Gracias. Tú y Allen Ding tuvieron respuestas especialmente buenas. – mipadi