2011-12-16 19 views
5

Digamos, por ejemplo, que tengo una implementación de UIView. UIView contiene dos etiquetas, una imagen y un marco.¿En general es una mala práctica tener muchos parámetros "initWith"?

Mi método "init" termina pareciéndose a:

- (id)initWithFrameAndLabelArrayAndImage:(CGRect)frame:(NSArray *)labelArray:(UIImage *)image; 

¿se considera una mala práctica? ¿Es mejor tener un método simple "initWithFrame" y tener la otra etiqueta y la imagen como @properties?

+0

Lo que acabaste de conclusión? – bryanmac

Respuesta

7

Está bien. Apple lo hace con frecuencia. Por ejemplo, un vistazo a NSString:

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsstring_Class/Reference/NSString.html

– initWithBytes:length:encoding: 
– initWithBytesNoCopy:length:encoding:freeWhenDone: 
– initWithCharacters:length: 
– initWithCharactersNoCopy:length:freeWhenDone: 
– initWithString: 
– initWithCString:encoding: 
– initWithUTF8String: 
– initWithFormat: 
– initWithFormat:arguments: 
– initWithFormat:locale: 
– initWithFormat:locale:arguments: 
– initWithData:encoding: 

Pero, a raíz de esos patrones, la suya:

- (id)initWithFrameAndLabelArrayAndImage:(CGRect)frame:(NSArray *)labelArray:(UIImage*)image; 

probablemente debería ser:

- (id)initWithFrame:(CGRect)frame labels:(NSArray *)labelArray image:(UIImage *)image; 

Ahora, una vez dicho esto , Probablemente no pasaría una serie de etiquetas. Pasaría los datos y haría que la vista personalizada tomara esos datos y creara/diseñara las subvistas. Está exponiendo las vistas internas que componen su vista personalizada en los métodos públicos y es posible que desee cambiar la forma de representarlas y redactarlas en el futuro.

Otro enfoque sería utilizar delegados para representar las etiquetas que las etiquetas se representarían llamando al delegado para los datos que necesita, de forma similar a una vista de tabla.

+0

Lo suficientemente justo. Gracias por la rápida respuesta. –

0

Creo que esto es básicamente una cuestión de preferencia, pero personalmente me gusta crear "métodos de conveniencia" cada vez que mi lista de parámetros se ejecuta enloquecida (es decir, mensajes cortos que llaman a los más largos usando valores predeterminados). Por ejemplo ...

-(id)initWithFrame:(CGRect) frame { 
[self initWithFrame:frame andLabel:@"Default text"]; 
} 

-(id)initWithFrame:(CGRect) frame andLabel: (NSString *) str { 
... 
} 
... 
-(id)initWithFrame:(CGRect) frame andLabel: (NSString *) str ... andMothersMaidenName:(id) etc { ... } 

hago pregunta de por qué se usaría "initWithFrameAndLabelArrayAndImage:" como su primer parámetro, sin embargo, en lugar de sólo initWithFrame: andLabel: andArray: andImage:. Adición de todos los parámetros para el primer nombre del parámetro (y luego repetirlos en el los siguientes) me parece redundante.

5

Aunque tener múltiples parámetros está bien, realmente no debería tener ningún parámetro que no tenga nombre. En su caso, para llamar a su método se vería así:

[[* alloc] initWithFrameAndLabelArrayAndImage:frame :array :image]; 

Esto es generalmente una mala práctica. Me encargo de reorganizar su inicializador a ser más largo de las siguientes líneas:

- (id)initWithFrame:(CGRect)frame labelArray:(NSArray *)labelArray image:(UIImage *)image; 

o incluso

- (id)initWithFrame:(CGRect)frame andLabels:(NSArray *)labels andImage:(UIImage *)image; 
Cuestiones relacionadas