Después de leer un artículo humildemente llamado "Los Mandamientos del Código: Mejores Prácticas para la Codificación de Objective-C" por Robert McNally hace poco menos de dos años, adopté la práctica de usar propiedades para casi todos los miembros de datos de mis clases de Objective-C ( el 3er mandamiento a partir de mayo de 2012). McNally enumera estas razones para hacerlo (mi énfasis):
- Las propiedades imponen restricciones de acceso (como solo lectura)
- Las propiedades hacen cumplir la política de administración de memoria (fuerte, débil)
- Las propiedades brindan la oportunidad de implementar de manera transparente setters y getters personalizados.
- Las propiedades con setters o getters personalizados se pueden usar para aplicar una estrategia de seguridad de subprocesos.
- Tener una única forma de acceder a las variables de instancia aumenta la legibilidad del código.
Puse la mayoría de mis propiedades en categorías privadas, por lo que los números 1 y 4 generalmente no son problemas con los que me encuentro. Los argumentos 3 y 5 son más "suaves", y con las herramientas adecuadas y otras consistencias podrían convertirse en problemas. Finalmente, para mí, el más influyente de estos argumentos fue el número 2, la gestión de la memoria. He estado haciendo esto desde entonces.
@property (nonatomic, strong) id object; // Properties became my friends.
Para mis últimos proyectos, he cambiado a usar ARC, lo que me hizo dudar si crear propiedades para casi cualquier cosa sigue siendo una buena idea o tal vez un poco superflua. ARC se encarga de la memoria administrando objetos Objective-C para mí, lo que para la mayoría de los strong
miembros funciona bien si solo declaras los ivars. Los tipos C que tenía que administrar manualmente de todos modos, antes y después de ARC, y las weak
propiedades son en su mayoría públicas.
Por supuesto, todavía uso propiedades para cualquier cosa que necesite acceso desde fuera de la clase, pero en su mayoría son solo un puñado de propiedades, mientras que la mayoría de los miembros de datos se enumeran como ivars debajo del encabezado de implementación
@implementation GTWeekViewController
{
UILongPressGestureRecognizer *_pressRecognizer;
GTPagingGestureRecognizer *_pagingRecognizer;
UITapGestureRecognizer *_tapRecognizer;
}
Como experimento, he estado haciendo esto un poco más rigurosamente, y el alejamiento de las propiedades de todo tiene algunos efectos secundarios positivos.
- Los requisitos del código del miembro de datos (
@property
/@synthesize
) se redujeron a solo la declaración ivar. - La mayoría de mis
self.something
referencias se limpiaron solo_something
. - Es fácil distinguir qué miembros de datos son privados (ivars) y cuáles son públicos (propiedades).
- Por último, se siente más como si este fuera el propósito para el que Apple pretendía propiedades, pero eso es especulación subjetiva.
En cuanto a la pregunta : lentamente me estoy deslizando hacia el lado oscuro, usando cada vez menos propiedades a favor de los ivars de implementación. ¿Puede proporcionarme un poco de razonamiento de por qué debería seguir usando propiedades para todo, o confirmar mi corriente actual de pensamientos sobre por qué debería usar más ivars y menos propiedades solo donde sea necesario? La respuesta más persuasiva para cualquier lado recibirá mi marca.
EDITAR: McNally interviene en Twitter y dice : "Creo que mi razón principal para mantener las propiedades es: una forma de hacer todo, que hace todo (incluido KVC / KVO)".
fuente
También he estado reflexionando sobre esta pregunta. En mi humilde opinión, solo usar propiedades para los accesos hace que el código sea mucho más legible. Puede ver inmediatamente a qué variables se debe acceder públicamente. Y personalmente, siempre escribir @property (...) delante de una variable lleva mucho tiempo.
fuente