Esta no es una pregunta sobre el estilo. Se trata más sobre el uso adecuado del idioma en sí. Soy bastante nuevo en la programación y soy totalmente nuevo en Objective-C y Cocoa, pero después de leer sobre el lenguaje y consultar algunos ejemplos de código, aparecen algunos patrones de uso que no tienen sentido para mí. O más bien, parecen no ser óptimos en mi mente. Espero que todos puedan ayudar a educarme sobre el uso apropiado de algunos de estos constructos de lenguaje.Forma correcta de usar Objective C
las interfaces vs protocolos
que entienden los conceptos de interfaces y aplicación en lo que respecta a la abstracción. Sin embargo, el patrón dominante que veo en código de ejemplo de Objective-C es la siguiente ...
@interface Foo : NSObject
{
some ivars decls
}
some methods decls
@end
Y a continuación, el código de cliente en forma de ...
Foo* f = [[Foo alloc] init];
Esto parece extraño a mi. Foo parece ser una implementación en mi mente (independientemente de la desafortunada denominación de la palabra clave @interface). Las interfaces en mi mente no exponen variables de instancia. Un cliente de esta clase no debe estar expuesto a los detalles de mi implementación.
Objective-C tiene la palabra clave @protocol que, en mi opinión, es más una interfaz que la palabra clave @interface. Le permite definir los métodos y/o propiedades y eso es todo. Sin implementación. No hay variables de instancia. Solo interfaz.
@protocol Foo <NSObject>
some methods
maybe some properties
@end
@interface FooProvider : NSObject
+ (FooProvider*) sharedProvider;
- (id<Foo>) fooWithBlahBlah;
@end
lo tanto, el código de cliente podría tomar la forma de ...
id<Foo> f = [[FooProvider sharedProvider] fooWithBlahBlah];
[f whatever];
Esto parece (al menos para mí) para ser un uso más abstracto de la lengua y aislamientos clientes de detalles de implementación de los cuales no deben depender. Mi pregunta es: ¿qué debo esforzarme por seguir? Entiendo que puede haber situaciones en las que una es preferible a la otra, pero en términos generales, ¿debería haber una norma y una sería la excepción?
Alguna orientación sería apreciada.
Gracias, romana
Buena respuesta, especialmente para abordar la pregunta del OP sobre la instancia privada variables en el archivo de encabezado. Simplemente agregando un enlace a otra pregunta sobre SO sobre ese problema en particular: http://stackoverflow.com/questions/966893/why-are-instance-variables-defined-in-the-header-file-in-objective-c –
Objetivo -C es una capa realmente delgada sobre C. En realidad solo se trata de administrar algunas tablas de símbolos durante la compilación; muy similar al preprocesador c en sí. Estoy seguro de que la mayoría de las decisiones fueron para facilitar la codificación (como utilizar llaves cuadradas en lugar de parens, tenían que encontrar algo que pudieran analizar fácilmente y extraer del código circundante. Probablemente la razón por la que eligieron seguir la sintaxis de Lisp como bien - más fácil de analizar/extraer/reemplazar. Sin embargo, creo que el archivo de encabezado es solo de entrada, no solo un reemplazo simbólico, por eso es por eso que ponen variables ahí. –
No estaban siguiendo la sintaxis de Lisp, sino más bien la sintaxis de Smalltalk. Smalltalk intenta manejar tanto como sea posible (incluidas las declaraciones condicionales) a través del uso uniforme del paso de mensajes, y la sintaxis refleja este principio de diseño básicamente consistente en bloques anidados. – Felixyz