2010-10-11 7 views
15

Soy nuevo en Objective-C, pero por favor ayúdenme aquí.Firmas de método Objective-C. ¿Son inconsistentes?

Lo que estoy viendo es que las firmas de método en Objective-C que toman varios parámetros parecen inconsistentes.

Ejemplo:

- (void) sendEmail: (NSString *) toStr 
     subject:(NSString *) subjectStr 
     body:(NSString *) bodyStr; 

OK, así que aquí tenemos 3 "parámetros" (al menos eso es lo que estoy acostumbrado a llamarlos), pero 2 de ellos tienen nombres "externos" (asunto, cuerpo) pero el primero no! ¿No hay algo mal con eso desde un punto de vista de consistencia/estilo?

Cuando llamamos a este método lo hacemos así:

[emailObj sendEmail:@"[email protected]" subject:@"testSub" body:@"this is a test"] 

(Con suerte lo hice bien, recuerdo que soy nuevo en esto.)

lo tanto, el asunto y el cuerpo están claramente marcados en la llamada, pero no en la dirección "para" Parece realmente excitado para mí. ¿Por qué ese primer parámetro recibe un tratamiento especial?

Respuesta

14

supongo que pensó que, en la declaración del método

-(void) A:(NSObject*)a B:(NSObject*)b C:(NSObject*)c 

A es el nombre del método, y BC son los nombres de parámetros.

En Objective-C, la totalidad A:B:C: es el nombre del método (más técnicamente, llamado el selector de ) y se utiliza como una unidad cuando se llama a un método por el nombre. Por ejemplo,

if([obj respondsToSelector:@selector(A:B:C:)]){ 
    ... 
} 

comprueba si obj responde a A:B:C:. Pero [obj respondsToSelector:@selector(A:)] será NO en este caso.

Por lo tanto, realmente debería pensar en la totalidad de A:B:C: como el nombre del método, y A es el nombre del primer parámetro.

Tenga en cuenta también que no puede llamar al A:B:C: como A:C:B:, tampoco.

+0

Gracias, eso ayuda un poco, pero todavía no me gusta. Me gusta tener métodos cuyos nombres sean más genéricos y cuyos argumentos o parámetros proporcionen algunos de los detalles. – Fraggle

+0

En otras palabras, si piensas en llamadas de función/método en C, C++, Java, Perl, Javascript, C#, Python, PHP, etc., el nombre del método sería típicamente sendEmail y tomaría 3 argumentos/parámetros. Esto también funciona bien cuando quieres sobrecargar tu método para que tengas una versión que demore 2 argumentos, otra que tome 3. Todos tendrán el mismo nombre de método pero solo un número diferente de argumentos. Además, creo que la mayoría de la gente no piensa en "A: B: C" como el nombre del método, aunque técnicamente puede ser. La mayoría de los libros que he visto se refieren a A como el nombre del método o lo tratan como tal. – Fraggle

+5

Bueno, no puedo hacer nada por ti si no te gusta. Así es la vida en Objective-C. Debe indicarle a los ejecutores de Objective-C en Apple. Y, debes grabar en cenizas esos libros que se refieren a 'A' como el nombre del método. Eso es técnicamente incorrecto y solo confunde al lector. Usted eligió un libro equivocado. – Yuji

10

Yo diría que si está confundido acerca de lo que hace un método, entonces probablemente no sea nombrado tan bien como podría haberlo sido.

Dado el selector anterior, esperaría que los 3 parámetros fueran algún tipo de objeto de correo electrónico, un asunto y un cuerpo. Dado que, sin embargo, el primer parámetro no es un objeto "Enviar", sino más bien el destinatario de un correo electrónico, probablemente me cambio el nombre de este método es:

- (void) sendEmailToRecipient:(NSString *)recipient subject:(NSString *)subject body:(NSString *)body; 
+0

¿Qué pasa si se trata de un método para dibujar un rectángulo? Entonces parece que necesitaría lo incómodo: "- (void) drawRectangleWidth: (int) width drawRectangleHeight: (int) height", que agrupa el objetivo principal (dibujando un rectángulo) con los nombres de los parámetros. – Fraggle

+0

Nuevamente, esa es la convención que Apple eligió usar.El objetivo de Apple no es acortar la expresión y solo escribir el objetivo principal; la idea es que la API te obliga a escribir las oraciones en inglés que describen la acción, incluso sin comentarios explícitos. – Yuji

+0

'- (void) drawRectangleWithWidth: (int) width andHeight: (int) height' sería más probable. Mi punto de vista es que es una mejora sobre 'c', ya que la semántica del uso del argumento es invisible en el código escrito (están en la declaración, no en el uso), pero dado que agregaron bloques que usan formato C, no formato selector, parece que no todos están de acuerdo. –

12

En la mayoría de los casos, los métodos de este tipo normalmente se denominan de manera que la falta de un nombre en el primer parámetro tiene sentido. En este caso, esperaría algo como sendEmailTo.

+1

Bien, lo entiendo, pero parece extraño. Quiero decir que mi objetivo es enviar un correo electrónico, la dirección es solo un componente. – Fraggle

+0

@Paul G .: No estoy necesariamente diciendo que las convenciones de Objective C son más sensatas que la invocación de método estilo C tradicional (personalmente no creo que lo sean, pero eso puede ser solo porque C-style es lo que soy solía), pero esto es lo que son. –

Cuestiones relacionadas