2009-11-07 6 views
10

Esta pregunta trata sobre el estilo de nomenclatura variable en el objetivo cy cacao. Solo quiero enfatizar que no estoy buscando una respuesta "correcta", solo buenas ideas.Convenios de nomenclatura de instancias de instancia en Cocoa

He leído las guías de estilo objetivas c de Apple y Google y no estoy muy contento con ninguna de ellas. La guía de Apple no tiene ninguna recomendación de estilo real con respecto a las variables de instancia frente a las variables locales. De hecho, la biblioteca Cocoa en sí misma parece perfectamente feliz de tener parámetros de función del mismo nombre que las variables de instancia. Eso me hace temblar personalmente.

La guía de Googles especifica que las variables de instancia se deben indicar con un guión bajo final. De acuerdo, todo está muy bien, pero sugiere que sinteticemos todas las propiedades públicas con @synthesize property = property_. No sé de nadie más, pero me condenaré si voy a hacer eso para cada variable de instancia en mi proyecto. Creo que es una solución derrochadora y confusa.

Tengo la tentación de ir con el estilo de nombre myX (por ejemplo, "myInstanceVariable") para las propiedades de los objetos, pero rara vez he visto ese estilo en el objetivo c.

Así que sí, ¿qué usas? ¿Hay alguna convención de estilo que desconozca que haya encontrado útil? ¿Cree que los parámetros de la función con el mismo nombre que las variables de instancia son peligrosos, especialmente en múltiples entornos de desarrollador? Gracias chicos y chicas!

NOTA - Como mucha gente ha señalado, mi terminología no estaba en el OP. Disculpas si la redacción original dañó la claridad, pero creo que el punto aún estaba claro.

Respuesta

10

que tienden a utilizar instancia de variable nombres sin prefijo (nótese que "variable miembro" es una ++ ismo C ya que es sugerente de estructuras y clases siendo principalmente intercambiables, que no es el caso en Objective-C) y en los casos en que surge la ambigüedad, yo uso la convención Smalltalk de nombrar el parámetro por su tipo con "a" o "una", por ejemplo:

- (void)setFoo:(SOFoo *)aFoo; 
{ 
    foo = aFoo; 
} 

(por supuesto, en ObjC moderna que había use una propiedad para esto.)

Usando theFoo en lugar de aFoo también es algo común; ver las respuestas a this question.

La convención de Google tiene sentido si realmente te preocupan los conflictos. Si usa un Xcode text macro o una herramienta como Completion Dictionary o Accessorizer para generar sus directivas, es bastante fácil de adoptar.

Tenga en cuenta que la Cocoa key-value coding guidelines más o menos suponer que (a) no prefijo/sufijo sus nombres de las variables de instancia, o (b) se implementa (o sintetizar) descriptores de acceso sin prefijo/sufijo para ellos. Como alguien más mencionó, no use el prefijo _; está reservado para el uso de Apple en sus marcos.

+0

Buena respuesta. Estoy de acuerdo en que prefijar el parámetro es más limpio que tratar de calzar una convención en variables de instancia objetivo c. Los documentos de Apple describen las convenciones para esto en el caso de los tipos comunes de objetos NSO, por lo que extenderlo para sus propios tipos tiene mucho sentido. Estoy marcando esto como la respuesta porque responde mejor al punto principal de mi pregunta, evitando el espaciado de nombres ambiguos en las funciones de clase, y no agrega ninguna convención o solución alternativa. – DougW

-1

m_variableName es bastante común también para las variables miembro. Personalmente, la mayoría de las veces, solo uso el mismo nombre para ambas variables y hago la distinción entre this.varname y varname.

+0

Sí que he visto m_x vez en cuando, pero con la convención colocador en el objetivo c parece desordenado. setM_variableName? Supongo que si te apegas a la notación de puntos, evitas eso. – DougW

+1

El prefijo "m_" es un mal hábito. También lo es el subrayado principal único, a menos que esté escribiendo código para uso interno en Apple. Desafortunadamente, Apple ha dejado que una cantidad de proyectos de código de muestra salgan a la calle sin una limpieza adecuada. – NSResponder

+1

¿Por qué _foo es un mal hábito? Apple no puede agregar ivars al código Obj-C 1.0, por lo que no pueden romper el tuyo. Y tal como lo entiendo, el compilador los ajusta en Obj-C 2.0 de modo que aunque Apple puede romper la compilación de su código (fácil de arreglar), los programas ya compilados continuarán funcionando. –

4

En Cocoa, el estilo es tener nombres pascalCased (¿o es que camelCased? Nunca puedo recordar); y tienen las variables miembro con el mismo nombre que los métodos de acceso. (Tal como NSInteger anInteger, - anInteger y - setAnInteger:).

Puede que no sea el mejor estilo, pero es probable que sea una buena idea acostumbrarse a él si va a hacer cualquier trabajo con Cocoa, ya que varios mecanismos asumen este tipo particular de convención de nomenclatura.

+0

Claro, estoy al tanto de las convenciones obligatorias getter/setter, y no me desviaría del caso camel. Mi pregunta es más similar a la notación utilizada para indicar la diferencia entre una instancia y una variable miembro. De hecho, puede sintetizar métodos de acceso con cualquier nombre para cualquier variable como en el estilo de google, pero eso podría ser muy confuso. – DougW

6

Primero: no hay "variables de miembro" en Objective-C, hay "Variables de instancia" o "ivars".

Google no es ningún tipo de autoridad en la codificación de Objective-C o el desarrollo de Mac. Google Earth es una aplicación Qt: 'dijo nuff.

Parece que recuerdo haber visto una guía de estilo de codificación oficial de Apple para Objective-C, que no estoy encontrando por el momento. Este artículo es un resumen bastante bueno, sin embargo:

http://cocoadevcentral.com/articles/000082.php

encontrado! He aquí las pautas de codificación oficial de Apple para el Cacao:

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.html

+0

Gracias por vincular las directrices de Apple. Creo que el resto de esto está fuera de tema. Todo el mundo parece querer utilizar su conocimiento de la taxonomía de la terminología c, pero no responder a la pregunta en cuestión. Además, Google puede no haber inventado el objetivo c, pero ciertamente son una fuente válida cuando se trata de convenciones de codificación. En este caso, no creo que los documentos de Apple fueran explícitamente claros sobre esto y Google sí. Simplemente, no me gusta su respuesta. – DougW

Cuestiones relacionadas