2010-09-14 29 views
35

Vengo del mundo de Objective-C y Cocoa, donde hay muchas convenciones y mucha gente dirá que hace que tu código sea hermoso. Ahora la programación en C++ no puedo encontrar un buen documento como este para C++.¿Qué es una buena convención de nombres para vars, métodos, etc. en C++?

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

estándar de C++ no tiene probablemente algo así como el anterior pero espero que pueda pegarse a algún otro SDK o API (como Microsoft (?), Etc) convenciones.

Espero que pueda proporcionarme algunos enlaces.

+97

Prometo vengar a cualquiera que sugiera el húngaro. – AShelly

+8

@AShelly: lee la publicación de Joel Spoolsky sobre Notación húngara y puede cambiarte la idea. No estoy de acuerdo con él, pero la publicación vale la pena, no obstante, ya que explica el ENORME malentendido en este esquema. –

+28

Prometo rechazar a cualquiera que sugiera las convenciones de Google. – Philipp

Respuesta

59

Haga lo que quiera siempre que sea mínimo, consistente y doesn't break any rules.

Personalmente, encuentro que el estilo Boost es más fácil; coincide con la biblioteca estándar (dando un aspecto uniforme al código) y es simple.Yo personalmente virar en m y p prefijos a los miembros y los parámetros, respectivamente, dando:

#ifndef NAMESPACE_NAMES_THEN_PRIMARY_CLASS_OR_FUNCTION_THEN_HPP 
#define NAMESPACE_NAMES_THEN_PRIMARY_CLASS_OR_FUNCTION_THEN_HPP 

#include <boost/headers/go/first> 
#include <boost/in_alphabetical/order> 
#include <then_standard_headers> 
#include <in_alphabetical_order> 

#include "then/any/detail/headers" 
#include "in/alphabetical/order" 
#include "then/any/remaining/headers/in" 
// (you'll never guess) 
#include "alphabetical/order/duh" 

#define NAMESPACE_NAMES_THEN_MACRO_NAME(pMacroNames) ARE_ALL_CAPS 

namespace lowercase_identifers 
{ 
    class separated_by_underscores 
    { 
    public: 
     void because_underscores_are() const 
     { 
      volatile int mostLikeSpaces = 0; // but local names are condensed 

      while (!mostLikeSpaces) 
       single_statements(); // don't need braces 

      for (size_t i = 0; i < 100; ++i) 
      { 
       but_multiple(i); 
       statements_do(); 
      }    
     } 

     const complex_type& value() const 
     { 
      return mValue; // no conflict with value here 
     } 

     void value(const complex_type& pValue) 
     { 
      mValue = pValue ; // or here 
     } 

    protected: 
     // the more public it is, the more important it is, 
     // so order: public on top, then protected then private 

     template <typename Template, typename Parameters> 
     void are_upper_camel_case() 
     { 
      // gman was here     
     } 

    private: 
     complex_type mValue; 
    }; 
} 

#endif 

Eso. (Y como he dicho en los comentarios, qué no aprobará la guía de estilo para Google su código, a menos que sea por algo tan insignificante como la convención de nombres.)

+39

¡Hola! ¡sigues tu preferencia de estilo de corsé! Personalmente, prefiero tener frenos incluso para frases de una línea, es fácil arruinar la sangría (cuando personas editan inadvertidamente con otra configuración de tabulación/espacio) y las llaves hacen que el alcance sea evidente para que no te preguntes si la siguiente línea se suponía que pertenecía al bloque o no ... –

+0

+1: Sí, ese es el estilo que uso en mis propios proyectos.INCLUYE la preferencia de estilo de corsé;) –

+1

La mía es similar. La unica diferencia. Los tipos comienzan con una letra mayúscula. Todo lo demás comienza con una letra minúscula (solo mi peculiaridad). –

3

Mientras que muchas personas sugieren variantes más 0 menos Hungarian notation (scary!), Para dar nombre a las sugerencias, sugiero que eche un vistazo a Google C++ Coding Guidelines. Esta bien puede no ser la convención de nombres más popular, pero al menos es bastante completa. Además de las convenciones de nombres de sonido, hay algunas pautas útiles allí, sin embargo, gran parte de lo que se debe tomar con un grano de sal (prohibición de excepción, por ejemplo, y la tendencia a mantenerse alejado del estilo moderno de codificación C++).

Aunque personalmente me gusta el estilo de convención de baja tecnología extrema de STL y Boost;).

+12

Las pautas de codificación C++ de Google son terribles, no las adopte. (Excepto cualquier cosa tan intrascendente como las convenciones de nomenclatura.) La guía de estilo de Google es la antítesis del buen código moderno de C++. – GManNickG

+5

@GMan: estoy de acuerdo, las directrices de Google están destinadas específicamente a ser compatibles con versiones anteriores de su código C existente (como se menciona explícitamente en las directrices). Para un nuevo proyecto, son uno de lo peor que podría pasar. –

+1

@GMan, eso es lo que inicialmente pensé también, pero un estudio más cuidadoso del documento me hizo darme cuenta de que logra un buen equilibrio entre dejar algo de espacio para respirar a los profesionales y (lo que es más importante) no permitir que los desarrolladores novatos exploten. No puede contar con tener un equipo de buenos codificadores modernos de C++ en ninguna parte, e incluso un codificador incorrecto puede arruinar una buena base de código sin pautas estrictas ... –

0

no tan concisa como el enlace que ya ha proporcionado: pero el siguiente capítulo 14 - 24 de mayo ayudar :) jeje

ref: http://www.amazon.com/Coding-Standards-Rules-Guidelines-Practices/dp/0321113586/ref=sr_1_1?ie=UTF8&s=books&qid=1284443869&sr=8-1-catcorr

+0

Acabo de hojearlo, y no hay nada acerca de nombrar allí (excepto el obvio_like_dont_do_too_long_and_useless_variable_names ...) –

+0

doooh ... tienes razón. Estaba pensando en convenciones "estructurales" en lugar de nombrar las convenciones porque no estaba tratando de entender su pregunta y leer el enlace que me brindó. – alien052002

+0

Este libro trata de elementos del estilo de programación que ayudan a mejorar la calidad del código, y los detalles irrelevantes como las convenciones de nomenclatura se resumen en el Ítem 0: No Sudar Las Cosas Pequeñas (o: Sepa Qué No Normalizar). No ayudará si siente la necesidad de estandarizar los detalles irrelevantes. –

3

Para abordar la cuestión más amplia de guías de estilo Sugiero elegir uno y apegándose a eso
El Google style guide es muy detallado/completo, por lo que es una buena opción.

Una convención común sólo para nombrar es:

  • camelCase para todos los nombres (excepto constantes).
  • Comenzando con un capital si se trata de una clase.
  • Minúscula si no es así.
  • Constantes en ALL_CAPS con trabajos de separación de subrayado.
  • Las funciones se pueden escribir igual que las variables, camelCase (se puede decir que es una función porque requiere () después).
  • Y las variables miembro con un prefijo m y por lo tanto se escribirían mCamelCase.

Depende realmente de usted o, alternativamente, las personas para las que trabaja o la universidad en la que estudia.

Para una vista detallada de una variedad de guías de estilo/fundamentos detrás de ellas, consulte Pragmatic Programmer por Andrew Hunt y David Thomas.

+7

Detallado no implica bueno. Como dije en la respuesta de Kornel, el GSC es horrible. Solo funciona para ellos porque tenían una gran cantidad de C preexistente con clases (es decir, código de C++ malo). El C++ moderno es mejor y contradictorio con la guía de estilo. – GManNickG

+0

En realidad, en mi humilde opinión, el detalle está cerca del bien. Si no es el GSC, busque otro detallado, (eso es bueno) y úselo. Lo importante es ser constante. Y una guía detallada ayuda con eso. Entonces, si el GSC es sorprendentemente atemorizante, busque otro y cúmplalo. –

1

Realmente no importa. Solo asegúrate de nombrar tus variables y funciones descriptivamente. También sé consistente.

Nowt peor que ver código como este:

int anInt;     // Great name for a variable there ... 
int myVar = Func(anInt); // And on this line a great name for a function and myVar 
          // lacks the consistency already, poorly, laid out! 

Edit: Como ha señalado mi comentarista en que la consistencia tiene que ser mantenida a través de todo un equipo. Como tal, no importa qué método elija, siempre que se mantenga esa coherencia. Sin embargo, no existe un método correcto o incorrecto. Cada equipo en el que he trabajado ha tenido diferentes ideas y me he adaptado a ellas.

+2

SÍ importa. Hablas como si nunca hubieras trabajado en un equipo antes. –

+4

Bueno, NO importa siempre que sea descriptivo y consistente ... Sí en un equipo que significa mantener esa coherencia en todo un equipo. Actualizaré mi respuesta. – Goz

19

Probablemente haya tantas convenciones de nomenclatura como personas, el debate es interminable (y estéril) sobre qué estilo de refuerzos usar y demás.

Así que voy a tener 2 consejos:

  • sean consistentes dentro de un proyecto
  • no utilizan identificadores reservados (cualquier cosa con dos guiones bajos o que comienzan con un guión bajo seguido de una letra mayúscula)

El resto depende de usted.

+10

+1 por "ser consistente"; esa es la regla más importante del lote (y la única con la que probablemente todos estarán de acuerdo). –

+0

+1 identificadores reservados, solo porque el compilador no lo está usando ahora no significa que la próxima versión no lo hará –

1

Hay muchos símbolos/convenciones diferentes que las personas usan al codificar C++. Por ejemplo, algunas personas prefieren separar palabras usando mayúsculas (myVar o MyVar), o usando guiones bajos (my_var). Normalmente, las variables que usan guiones bajos están en minúsculas (según mi experiencia).
También hay un estilo de codificación llamado húngaro, que creo que es usado por microsoft. Personalmente, creo que es una pérdida de tiempo, pero puede resultar útil. Este es el nombre de las variables que reciben prefijos cortos como i o f para indicar el tipo de variables. Por ejemplo: int iVarname, char * strVarname.

Se acepta que finalice un nombre de estructura/clase con _t, para diferenciarlo de un nombre de variable. Ej .:

class cat_t { 
    ... 
}; 

cat_t myCat; 

Está generalmente aceptado también añadir un afijo para indicar punteros, como pVariable o variable_p.

En total, realmente no hay una sola estándar, pero muchas. Las elecciones que haga para nombrar sus variables no son importantes, siempre que sea comprensible y, sobre todo, coherente. Consistencia, consistencia, consistencia! (¡intente escribir ese tres veces!)

Y si todo lo demás falla, escríbalo.

+3

Nombrar ** cada ** clase con una terminación '_t' sería francamente malvado ... –

+1

Se usa para clases utilizadas como tipos de datos. –

+3

¿qué clases no son? –

7

seguimos las directrices que figuran en esta página: C++ Programming Style Guidelines


También recomiendo que leas The Elements of C++ Style by Misfeldt et al, que es bastante un excelente libro sobre este tema.

+0

¿Puedo utilizar el documento al que se hace referencia en su PRIMER enlace como documento guía en un proyecto que estoy comenzando? –

+0

@HomunculusReticulli, sí, seguro. – missingfaktor

+0

¡Gracias !, muy apreciado! (debería hacer la vida más fácil también). A propósito, ¿hay alguna atribución que deba hacer en la parte inferior del texto, etc.? - En caso afirmativo, ¿a quién atribuyo? –

10

De hecho, a menudo uso el estilo de Java: PascalCase para nombres de tipos, camelCase para funciones y variables, CAPITAL_WORDS para macros de preprocesador. Prefiero eso sobre las convenciones de Boost/STL porque no es necesario que los tipos de sufijo con _type. P.ej.

Size size(); 

en lugar de

size_type size(); // I don't like suffixes 

Esto tiene la ventaja adicional de que el formateador de código Stackoverflow reconoce Size como un nombre de tipo ;-)

2

consistencia y facilidad de lectura (código de auto-documentado) son importantes . algunas pistas (como el caso) pueden y deben usarse para evitar colisiones e indicar si se requiere una instancia.

una de las mejores prácticas que tuve fue el uso de formateadores de código (astyle y uncrustify son 2 ejemplos). los formateadores de código pueden destruir el formato del código: configure el formateador y deje que haga su trabajo. en serio, olvídate del formato manual y entra en la práctica de usarlos. ahorrarán una tonelada de tiempo.

según lo mencionado, ser muy descriptivo con nombrar. también, sea muy específico con el alcance (tipos de clase/datos/espacios de nombres/espacios de nombres anónimos). en general, me gusta mucho la forma escrita común de Java, que es una buena referencia y similar a C++.

como para línea específico/nomenclatura, esto es una pequeña muestra similar a lo que yo uso (variables/argumentos se lowerCamel y esto sólo demuestra una parte de las funciones del lenguaje):

/** MYC_BEGIN_FILE_ID::FD_Directory_nanotimer_FN_nanotimer_hpp_::MYC_BEGIN_FILE_DIR::Directory/nanotimer::MYC_BEGIN_FILE_FILE::nanotimer.hpp::Copyright... */ 
#ifndef FD_Directory_nanotimer_FN_nanotimer_hpp_ 
#define FD_Directory_nanotimer_FN_nanotimer_hpp_ 

/* typical commentary omitted -- comments detail notations/conventions. also, no defines/macros other than header guards */ 

namespace NamespaceName { 

/* types prefixed with 't_' */ 
class t_nanotimer : public t_base_timer { 
    /* private types */ 
    class t_thing { 
     /*...*/ 
    }; 
public: 
    /* public types */ 
    typedef uint64_t t_nanosecond; 

    /* factory initializers -- UpperCamel */ 
    t_nanotimer* WithFloat(const float& arg); 
    /* public/protected class interface -- UpperCamel */ 
    static float Uptime(); 
protected: 
    /* static class data -- UpperCamel -- accessors, if needed, use Get/Set prefix */ 
    static const t_spoke Spoke; 
public: 
    /* enums in interface are labeled as static class data */ 
    enum { Granularity = 4 }; 
public: 
    /* construction/destruction -- always use proper initialization list */ 
    explicit t_nanotimer(t_init); 
    explicit t_nanotimer(const float& arg); 

    virtual ~t_nanotimer(); 

    /* 
     public and protected instance methods -- lowercaseCamel() 
     - booleans prefer is/has 
     - accessors use the form: getVariable() setVariable(). 
     const-correctness is important 
    */ 
    const void* address() const; 
    virtual uint64_t hashCode() const; 
protected: 
    /* interfaces/implementation of base pure virtuals (assume this was pure virtual in t_base_timer) */ 
    virtual bool hasExpired() const; 
private: 
    /* private methods and private static data */ 
    void invalidate(); 
private: 
    /* 
     instance variables 
     - i tend to use underscore suffix, but d_ (for example) is another good alternative 
     - note redundancy in visibility 
    */ 
    t_thing ivar_; 
private: 
    /* prohibited stuff */ 
    explicit t_nanotimer(); 
    explicit t_nanotimer(const int&); 
}; 
} /* << NamespaceName */ 
/* i often add a multiple include else block here, preferring package-style inclusions */  
#endif /* MYC_END_FILE::FD_Directory_nanotimer_FN_nanotimer_hpp_ */ 
+0

Definitivamente te encantan las minúsculas; D – bluish

+0

@bluish ... y no me gustan las colisiones :) – justin

Cuestiones relacionadas