2010-09-06 24 views
36

He visto a gente usar un guión bajo final para las variables miembro en las clases, por ejemplo en el renombrado C++ FAQ Lite.caracteres de subrayado posteriores para las variables miembro en C++

Creo que su propósito no es marcar variables como miembros, para eso es "m_". Es propósito real es hacer que sea posible tener un método de acceso llamado como el campo, así:

class Foo { 
public: 
    bar the_bar() { return the_bar_; } 
private: 
    bar the_bar_; 
} 

Tener descriptores de acceso omiten la parte "get_" es común en la STL y de impulso, y yo estoy tratando de desarrolle un estilo de codificación lo más parecido posible a estos, pero realmente no puedo verlos usando el truco de subrayado. No pude encontrar un descriptor de acceso en STL o boost que simplemente devolviera una variable privada.

Tengo algunas preguntas que espero que será capaz de responder:

  1. dónde viene esta convención viene? ¿Charla? ¿C objetivo? Microsoft? Me pregunto.
  2. ¿Usaría el guión bajo final para todos los miembros privados o simplemente como una solución en caso de que quiera nombrar una función como una variable?
  3. ¿Puede indicarme STL o aumentar el código que muestra guiones bajos para las variables miembro?
  4. ¿Alguien sabe cuáles son las opiniones de Stroustrup sobre el tema?
  5. ¿Me puede indicar una discusión adicional del problema?
+1

Para el punto 4, consulte http://www2.research.att.com/~bs/bs_faq2.html – Chubsdad

+2

@Nick D: ¿Cómo puede ser un duplicado, lo leyó? Hace una pregunta completamente independiente, es decir, si un guion bajo (!) Es legal en C++. – eomer

+0

@eomer: ok, lo eliminé :) –

Respuesta

7

Hablando por mí solo ... Siempre utilizo el guión bajo final para los miembros de datos privados, independientemente de si tienen funciones de acceso o no. No uso m_ principalmente porque se mete en el camino cuando deletreo mentalmente el nombre de la variable.

12

yo soy personalmente un gran fan de esta directriz: http://geosoft.no/development/cppstyle.html

Incluye omitiendo el prefijo m_, usando un sufijo subrayado para indicar las variables miembro privadas y soltando el horrible, molesto-a-tipo de hábito de usar guiones bajos en vez de espacio, y otras sugerencias más detalladas y específicas, como nombrar bools adecuadamente (isDone en lugar de solo done) y usar getVariable() en lugar de solo variable(), por nombrar algunos.

+7

Bueno, la mayoría de estas cosas son solo personales preferencia estética, hasta el punto de que [este] (http://www.amazon.com/Coding-Standards-Rules-Guidelines-Practices/dp/0321113586) great Coding Standard subsume todo esto como: 0. No sudar las cosas pequeñas. (O: sepa qué no estandarizar). Solo sea consistente. –

+0

También prefiero no usar '[get | compute] Data()', porque el código como 'use (texture.data());' lee mucho mejor IMVHO, y no distrae al usuario de la clase con detalles que no debería No importa si los datos se almacenan en caché o si deben calcularse. –

+9

Creo que 'is_done' se lee mucho mejor que' isDone'. '_' se parece mucho más a un espacio que a ningún espacio. – GManNickG

1

Por lo que recuerdo, Microsoft no promovió el estilo del código de subrayado final para los miembros.

He leído que Stroustrup es pro the trailing underscore.

+0

¿Recuerdas dónde lo leíste? Estaría muy interesado porque siempre es interesante leer el razonamiento de Stroustrup. – eomer

+0

ok, déjame recordarlo alguna vez ;-), estoy casi seguro de que está en su sitio web, pero debería verificarlo. –

+14

"Me da toda la información a la vez" - hasta que alguien cambie el tipo y se olvide de actualizar las etiquetas pseudohúngaro. Luego dejan de ser útiles y se vuelven activamente dañinos. –

25

En C++,

  1. identificadores de comenzar con un guión bajo, seguido de una letra mayúscula
  2. identificadores que tienen dos guiones consecutivos en cualquier lugar
  3. identificadores en el espacio de nombres global a partir de un guión

están reservados para la implementación. (Se puede encontrar más sobre esto en here). En lugar de tratar de recordar estas reglas, muchas simplemente no usan identificadores que comiencen con un guión bajo. Es por eso que el guión bajo final fue inventado.
Sin embargo, C++ en sí mismo es viejo y se basa en 40 años de C, ninguno de los cuales tenía una sola compañía y una biblioteca estándar que ha "crecido" durante varias décadas, en lugar de crearse en un solo acto. de la creación Esto hace que existan muchas convenciones de nomenclatura diferentes. El guión bajo finalizado para partes privadas (o solo para datos privados) no es más que uno, muchos usan otros (no pocos entre ellos argumentando que, si necesita guiones bajos para informar a los miembros privados de las variables locales, su código no es lo suficientemente claro).

En cuanto a getters/setters - son una abominación, y una señal segura de "quasi classes", que odio.

+2

Estoy con usted allí, evito getters/setters siempre que sea posible. Pero a veces, en realidad son útiles, especialmente cuando se usan patrones de diseño de GOF. Un ejemplo simple: considere una clase que posee e inicia objetos (como el subsistema de gráficos en un motor de juego) y permite que otras clases accedan a ellos. Usaría un método de acceso, porque declarar la variable pública permitiría el acceso de lectura/escritura, mientras que solo quiero permitir el acceso de lectura. También puedo devolver una referencia constante para asegurar la precisión const al usar un accesorio. – eomer

3

Supongo que la utopía habría sido utilizar un guión bajo inicial - esto es bastante común en Java y C# para los miembros.

Sin embargo, para C, subrayado iniciales no son una buena idea, así que por lo tanto, creo que la recomendación de la C++ FAQ Lite para ir detrás de subrayado:

Todos los identificadores que comienzan con un subrayado y, o bien una letra mayúscula u otro guión bajo son siempre reservados para cualquier uso.

Todos los identificadores que comienzan con un guión bajo siempre están reservados para uso como identificadores con el ámbito de archivo tanto en los espacios de nombres comunes y etiquetas.


(especificación ISO C99, sección 7.1.3)

4

Como desarrollador de mantenimiento que le gusta la capacidad de búsqueda me estoy inclinando hacia m_ como su más búsquedas. Cuando tú, como yo, estamos manteniendo grandes proyectos con clases grandes (no preguntes) a veces te preguntas: "Hmmm, ¿quién muta el estado?". Una búsqueda rápida de m_ puede dar una pista.

También se sabe que utilizo l_ para indicar variables locales, pero el proyecto actual no usa eso, así que estoy "limpio" en estos días.

No soy fan de la notación húngara. C++ tiene un sistema de tipo fuerte, yo uso eso en su lugar.

+0

Fwiw, además de 'm_', prefijo' s_' a los miembros/métodos de la clase estática y 'd_' a las implementaciones derivadas cuando se usa CRTP. Nunca he tratado de denotar a los locales vs los parámetros usando 'l_' /' p_' ... y espero que no, ya que sería mucho trabajo para cambiar. : P –

14

He leído El lenguaje de programación C++ y Stroustrup no utiliza ningún tipo de convención para nombrar miembros. Él nunca necesita hacerlo; no hay un único acceso/mutador simple, tiene una forma de crear diseños muy finos orientados a objetos por lo que no es necesario tener un método del mismo nombre. Utiliza estructuras con miembros públicos cada vez que necesita estructuras de datos simples. Sus métodos siempre parecen ser operaciones. También leí en alguna parte que él desalienta el uso de nombres que difieren solo en un personaje.

+2

¿Qué tal, digamos, 'std :: vector :: size()'? Me imagino que podría contener un miembro 'size_'. – claymation

+2

"Utiliza estructuras con miembros públicos cada vez que necesita estructuras de datos simples". ¡Ese peligroso renegado! (+1) –

Cuestiones relacionadas