2011-11-21 11 views
17

La pregunta es bastante simple: cuando creo una nueva API o clase de servicio, debo crear una clase personalizada para los objetos que se están pasando o simplemente me quedo con un NSDictionary que simplemente contiene los datos en un formato de estilo clave-valor.NSDictionary frente a objeto personalizado

Obviamente, hay pros y contras, pero ¿dónde creen que es el umbral para usar uno sobre el otro?

NSDictionary:

+ Sin dependencias
+ muy flexible
+ uso general
+ construir-en el soporte para NSCoding
- estructura no definida -> Errores de ejecución

Un objeto personalizado:

+ estructura definida
+ descriptores de acceso de estilo propiedad: myObject.someProperty - puede resultar en un rel. gran número de clases de objetos anidados

Actualizar: observaciones incluidas desde jbat100

+1

que depende de sus preferencias. Por ejemplo, siempre tengo una lógica de capa de negocios (BLL) y generalmente hago objetos personalizados. – beryllium

Respuesta

9

Realmente depende de cuánto esperas que cambie tu modelo de datos. Hacer frente a los cambios una vez que tenga un modelo de datos personalizado basado en clases puede ser complicado, especialmente cuando tiene archivos (cosas NSCoding) con diferentes versiones del modelo (en las versiones ya enviadas de su aplicación), debe tener mucho cuidado para garantizar la compatibilidad con versiones anteriores y evitar sorpresas desagradables de tiempo de ejecución. En ese sentido, los modelos basados ​​en NSDictionary son, como usted dice, más flexibles. Sin embargo, no permiten todos los controles personalizados y el comportamiento de las clases personalizadas. También las clases personalizadas hacen que el modelo de datos sea más explícito para los programadores que no están familiarizados con el código. Según mi experiencia, los desarrolladores a menudo se vuelven descuidados (especialmente cuando no tienen experiencia) cuando se trata de modelos basados ​​en NSDictionary que pueden resultar en un desastre incomprensible, por lo que ruta, documentar bien y ser disciplinado!

+0

Gracias por mencionar el punto acerca de NSCoding no estaba al tanto de esa situación. Agregué esto a la lista de pro's y con's – Besi

11

por lo general tiene un conjunto de modelos de dominio, que encajan mejor con el enfoque MVC de desarrollo del iPhone. Tener objetos específicos también le permite hacer que la seguridad de tipo sea mucho más fácil y también reduce la complejidad a largo plazo. Si tiene NSDictionaries que contienen NSArrays y más NSDictionaries, etc. para representar su gráfico de objeto, puede convertirse rápidamente en inmanejable.

4

Si necesita acceso de sólo lectura y no necesitan métodos, puede hacer lo siguiente:

@interface NSDictionary (MyClassCategory) 
-(NSString*) someField; 
@end 

@implementation NSDictionary (MyClassCategory) 
-(NSString*) someField { 
    return [self objectForKey:@"someField"]; 
} 
@end 

typedef NSDictionary MyClass; 

y utilizarla:

MyClass* myClass = ...; 
    NSString* value = [myClass someField]; 
+4

¿De qué sirve crear una categoría sobre la creación de una clase personalizada? – Godfather

Cuestiones relacionadas