Gu铆a de estilo de Google en C ++. Parte 8

Parte 1. Introducci贸n
...
Parte 8. Nombramiento
Parte 9. Comentarios
...



Al escribir c贸digo, todos usamos las reglas de dise帽o de c贸digo. A veces se inventan sus propias reglas, en otros casos, se utilizan gu铆as de estilo confeccionadas. Aunque todos los programadores de C ++ leen en ingl茅s m谩s f谩cilmente que en su idioma nativo, es m谩s agradable tener un manual en este 煤ltimo.
Este art铆culo es una traducci贸n de parte de la gu铆a de estilo de Google en C ++ al ruso.
Art铆culo original (fork en github), traducci贸n actualizada .

Nombrar


Las reglas b谩sicas para el estilo de codificaci贸n son los nombres. La aparici贸n del nombre de inmediato (sin buscar un anuncio) nos dice qu茅 es: tipo, variable, funci贸n, constante, macro, etc. Las reglas de nomenclatura pueden ser arbitrarias, pero la coherencia es importante y se deben seguir las reglas.

Principios generales de denominaci贸n


  • Use nombres que incluso las personas del otro equipo entiendan.
  • El nombre debe hablar del prop贸sito o aplicabilidad del objeto.
  • No ahorre en la longitud del nombre, es mejor tener un nombre m谩s largo y m谩s comprensible (incluso para principiantes).
  • Menos abreviaturas, especialmente si no son familiares fuera del proyecto.
  • Utilice solo abreviaturas conocidas (驴Wikipedia las conoce?).
  • No acortes las palabras.

En general, la longitud del nombre debe coincidir con el tama帽o del alcance. Por ejemplo, n es un nombre adecuado dentro de una funci贸n de 5 l铆neas, sin embargo, al describir una clase, esto puede ser un poco corto.

class MyClass { public: int CountFooErrors(const std::vector<Foo>& foos) { int n = 0; //       for (const auto& foo : foos) { ... ++n; } return n; } void DoSomethingImportant() { std::string fqdn = ...; //      } private: const int kMaxAllowedConnections = ...; //     }; 

 class MyClass { public: int CountFooErrors(const std::vector<Foo>& foos) { int total_number_of_foo_errors = 0; //       for (int foo_index = 0; foo_index < foos.size(); ++foo_index) { //   `i` ... ++total_number_of_foo_errors; } return total_number_of_foo_errors; } void DoSomethingImportant() { int cstmr_id = ...; //   ( ) } private: const int kNum = ...; //       }; 

Tenga en cuenta que los nombres t铆picos tambi茅n son v谩lidos: i para un iterador o contador, T para un par谩metro de plantilla.

En el futuro, al describir las reglas "palabra" / "palabra" es todo lo que se escribe en ingl茅s sin espacios, incluidas las abreviaturas. En una palabra, la primera letra se puede poner en may煤scula (dependiendo del estilo: " caso de camello " o "caso de Pascal"), las letras restantes son min煤sculas. Por ejemplo, preferiblemente StartRpc () , preferiblemente StartRPC () .

Los par谩metros de plantilla tambi茅n siguen las reglas de sus categor铆as: nombres de tipos, nombres de variables, etc.

Nombres de archivo


Los nombres de archivo deben escribirse solo en letras min煤sculas, puede usar gui贸n bajo ( _ ) o gui贸n ( - ) para separarlos. Use el separador usado en el proyecto. Si no hay un enfoque 煤nico, use "_".

Ejemplos de nombres adecuados:

  • my_useful_class.cc
  • my-useful-class.cc
  • myusefulclass.cc
  • myusefulclass_test.cc // _unittest y _regtest est谩n en desuso.

Los archivos C ++ deben terminar en .cc , el encabezado debe estar en
.h . Los archivos incluidos como texto deben terminar en .inc (ver tambi茅n la secci贸n Encabezados independientes ).

No utilice nombres que ya existen en / usr / include , como db.h.

Intenta dar nombres espec铆ficos a los archivos. Por ejemplo, http_server_logs.h es mejor que logs.h. Cuando los archivos se usan en pares, es mejor darles el mismo nombre. Por ejemplo, foo_bar.h y foo_bar.cc (y contienen la clase FooBar ).

Escribe nombres


Los nombres de tipo comienzan con una letra may煤scula, cada nueva palabra tambi茅n comienza con una letra may煤scula. No se utilizan guiones bajos : MyExcitingClass , MyExcitingEnum .

Los nombres de todos los tipos (clases, estructuras, alias, enumeraciones, par谩metros de plantilla) se nombran con el mismo estilo. Los nombres de tipo comienzan con una letra may煤scula, cada nueva palabra tambi茅n comienza con una letra may煤scula. No se usan guiones bajos. Por ejemplo:

 // classes and structs class UrlTable { ... class UrlTableTester { ... struct UrlTableProperties { ... // typedefs typedef hash_map<UrlTableProperties *, std::string> PropertiesMap; // using aliases using PropertiesMap = hash_map<UrlTableProperties *, std::string>; // enums enum UrlTableErrors { ... 

Nombres de variables


Los nombres de las variables (incluidos los par谩metros de funci贸n) y los miembros de datos se escriben en min煤sculas con un gui贸n bajo entre las palabras. Los miembros de estas clases (no estructuras) se complementan con un gui贸n bajo al final del nombre. Por ejemplo: a_local_variable , a_struct_data_member , a_class_data_member_ .

Nombres de variables comunes


Por ejemplo:

 std::string table_name; // OK -     

 std::string tableName; //  -   

Miembros de datos de clase


Los miembros de estas clases, est谩ticos y no est谩ticos, se denominan variables ordinarias con la adici贸n de un gui贸n bajo al final.

 class TableInfo { ... private: std::string table_name_; // OK -    static Pool<TableInfo>* pool_; // OK. }; 

Miembros de datos de estructura


Los miembros de los datos de la estructura, est谩ticos y no est谩ticos, se denominan variables regulares. No se agrega subrayado al final.

 struct UrlTableProperties { std::string name; int num_entries; static Pool<UrlTableProperties>* pool; }; 

Vea tambi茅n Estructuras vs Clases , que describe cu谩ndo usar estructuras, cu谩ndo clases.

Nombres de constantes


Los objetos se declaran como constexpr o const, de modo que el valor no cambia durante la ejecuci贸n. Los nombres de las constantes comienzan con el s铆mbolo "k", luego viene el nombre en un estilo mixto (letras may煤sculas y min煤sculas). El subrayado se puede usar en casos raros cuando las letras may煤sculas no se pueden usar para la separaci贸n. Por ejemplo:

 const int kDaysInAWeek = 7; const int kAndroid8_0_0 = 24; // Android 8.0.0 

Tambi茅n se nombran todos los objetos constantes similares con un tipo de almacenamiento est谩tico (es decir, est谩tico o global, para m谩s detalles aqu铆: Duraci贸n del almacenamiento ). Esta convenci贸n es opcional para variables en otros tipos de almacenamiento (por ejemplo, objetos constantes autom谩ticos).

Nombres de funciones


Las funciones comunes se nombran en un estilo mixto (letras may煤sculas y min煤sculas); Las funciones de acceso variable (accesor y mutador) deben tener un estilo similar al de la variable objetivo.

Por lo general, el nombre de una funci贸n comienza con una letra may煤scula y cada palabra en el nombre est谩 en may煤scula.

 void AddTableEntry(); void DeleteUrl(); void OpenFileOrDie(); 

(Reglas similares se aplican a las constantes en un 谩rea de clase o espacio de nombres que son parte de la API y deber铆an verse como funciones (y el hecho de que no sean funciones no es cr铆tico))

Los accesores y mutadores (funciones get y set) se pueden nombrar como las variables correspondientes. A menudo corresponden a variables miembros reales, pero esto no es necesario. Por ejemplo, int count () y void set_count (int count) .

Espacio de nombres espacio de nombres


El espacio de nombres se llama min煤scula. El espacio de nombres de nivel superior se basa en el nombre del proyecto. Evite colisiones de sus nombres y otros espacios de nombres conocidos.

Un espacio de nombres de nivel superior suele ser el nombre de un proyecto o equipo (que cre贸 el c贸digo). El c贸digo debe ubicarse en un directorio (o subdirectorio) con un nombre correspondiente al espacio de nombres.

No olvide la regla de no usar abreviaturas ; esto tambi茅n se aplica a los espacios de nombres. Es improbable que el c贸digo interno requiera una referencia de espacio de nombres, por lo que las abreviaturas son superfluas.

Evite usar nombres conocidos para espacios de nombres anidados. Las colisiones entre nombres pueden dar lugar a sorpresas durante el montaje. En particular, no cree espacios de nombres anidados llamados std . Se recomiendan identificadores 煤nicos de proyecto ( websearch :: index , websearch :: index_util ) en lugar de inseguros contra colisiones websearch :: util .

Para espacios de nombres internos / internos , las colisiones pueden ocurrir cuando se agrega otro c贸digo (los asistentes internos tienden a repetirse en diferentes equipos). En este caso, usar un nombre de archivo para nombrar un espacio de nombres ayuda mucho. ( websearch :: index :: frobber_internal para usar en frobber.h )

Nombres de enumeraci贸n


Las enumeraciones (tanto con restricciones de 谩mbito como sin 谩mbito) deben denominarse constantes o macros . Es decir: kEnumName o ENUM_NAME .

Es preferible nombrar los valores individuales en el enumerador como constantes. Sin embargo, est谩 permitido referirse como macros. El nombre de la enumeraci贸n UrlTableErrors (y AlternateUrlTableErrors ) en s铆 mismo es un tipo. En consecuencia, se usa un estilo mixto.

 enum UrlTableErrors { kOk = 0, kErrorOutOfMemory, kErrorMalformedInput, }; enum AlternateUrlTableErrors { OK = 0, OUT_OF_MEMORY = 1, MALFORMED_INPUT = 2, }; 

Hasta enero de 2009, el estilo de nombrar valores de enumeraci贸n era como el de las macros. Esto cre贸 problemas con nombres de macro duplicados y valores de enumeraci贸n. La aplicaci贸n de un estilo constante resuelve el problema y es preferible utilizar un estilo constante en el nuevo c贸digo. Sin embargo, no es necesario volver a escribir el c贸digo anterior (todav铆a no hay problemas de duplicaci贸n).

Nombres de macro


驴No vas a definir macros ? Por si acaso (si vas a ir), deber铆an verse as铆:
MY_MACRO_THAT_SCARES_SMALL_CHILDREN_AND_ADULTS_ALIKE .

Lea c贸mo definir macros ; Normalmente, no se deben usar macros. Sin embargo, si los necesita absolutamente, n贸mbrelos en letras may煤sculas con guiones bajos.

 #define ROUND(x) ... #define PI_ROUNDED 3.0 

Excepciones de nombres


Si necesita nombrar algo que tenga an谩logos en el c贸digo C o C ++ existente, siga el estilo utilizado en el c贸digo.

bigopen ()
nombre de funci贸n derivado de open ()

Uint
definici贸n similar a los tipos est谩ndar

bigpos
estructura o clase derivada de pos

sparse_hash_map
Entidad similar a STL; seguir el estilo stl

LONGLONG_MAX
constante como INT_MAX

Nota: los enlaces pueden conducir a secciones del manual que a煤n no se han traducido.

Source: https://habr.com/ru/post/477722/


All Articles