2009-11-21 18 views
44

¿Cuál es la convención para nombrar funciones en C++?Nombres de funciones en C++: ¿Capitalizar o no?

que provienen del entorno Java por lo que suelen nombrar algo como:

myFunction(...) { 
} 

que he visto de códigos mixta en C++,

myFunction(....) 
MyFunction(....) 
Myfunction(....) 

Cuál es la forma correcta?

Además, ¿es igual para un método de clase que para un método que no es de clase?

+0

gracias a todos. Iré con myFunction() ya que eso es lo que estoy acostumbrado a – user69514

+0

No hay una forma "correcta", es todo opinión. pero recomiendo encarecidamente que evite los guiones bajos, hace que los nombres de las funciones sean más difíciles de leer. Mi estilo personal es FunctionName, porque es conciso, y es menos desagradable para mí. – MarcusJ

Respuesta

31

No hay una "forma correcta". Todos son sintácticamente correctos, aunque hay algunas convenciones. Puedes seguir el Google style guide, aunque hay otros por ahí.

A partir de dicha guía:

funciones regulares han mezclado caso; los accesadores y los mutadores coinciden con el nombre de la variable: MyExcitingFunction(), MyExcitingMethod(), my_exciting_member_variable(), set_my_exciting_member_variable().

+14

Hay una forma estándar ... La convención de nomenclatura estándar utilizada en todos los códigos de biblioteca estándar es my_name, excepto MACRO_NAMES o TemplateParameterTypeNames. Esto se deriva de las convenciones de C de Unix. Camel Case es una convención derivada del código de Microsoft c y C++. CamelCase es más difícil de leer. – catphive

+7

La notación húngara es de Microsoft. TitleCase y camelCase son mucho más antiguos y se han utilizado fuera de la informática como una alternativa a snake_case. –

+2

_Actually_ hay una "forma correcta". O para ser más específico, hay una "manera incorrecta". Concretamente, si desea que sus clases funcionen con el 'for'-loop__ basado en __range, [debe definir las funciones llamadas' begin' y 'end'] (http://stackoverflow.com/q/8164567/3425536) C++ no admite 'PascalCase' en esto. – emlai

3

Haga lo que desee, siempre y cuando sea coherente con su desarrollador. grupo. cada pocos años las convenciones de los cambios ..... (remmeber nIntVAr) ...

10

Si nos fijamos en la standard libraries the pattern generally is my_function, pero cada persona parece tener su propia manera: -/

+0

¿Por qué no sube? Las bibliotecas estándar literalmente le dicen el ESTÁNDAR para el estilo del código en la mayoría de los idiomas. –

+0

https://xkcd.com/927/ y ​​"lo bueno de los estándares es que hay muchos de ellos" – TofuBeer

3

Hay ISN' Es una forma "correcta" para el lenguaje. Es una preferencia más personal o cuál es el estándar para tu equipo. Usualmente uso myFunction() cuando estoy haciendo mi propio código. Además, un estilo que no mencionaste que a menudo verás en C++ es my_function(): sin mayúsculas, guiones bajos en lugar de espacios.

Realmente es dictado por el código en el que trabaja. O, si es su propio proyecto, su preferencia personal entonces.

22

La mayoría del código que he visto es camelCase funciones (minúscula inicial), y ProperCase/PascalCase nombres de clase, y (más habitualmente), snake_case variables.

Pero, para ser honesto, esto es solo una guía. Lo más importante es ser coherente en toda la base de códigos. Elija lo que parece natural/funciona para usted, y manténgalo. Si se está uniendo a un proyecto en progreso, siga sus estándares.

+1

Esto es lo que estoy usando, pero ¿qué pasa con los espacios de nombres? ¿No es extraño tener 'std :: vector' pero' Project :: Connection :: TcpHandler'? –

+1

Solo si agrega cosas a la estándar De lo contrario, solo sea internamente consistente. – Donnie

4

Creo que es una cuestión de preferencia, aunque yo prefiero myFunction(...)

2

Todo depende de su definición de correcto. Hay muchas maneras en que puede evaluar su estilo de codificación. La legibilidad es importante (para mí). Es por eso que usaría la forma my_function de escribir nombres de funciones y nombres de variables.

4

A diferencia de Java, C++ no tiene un "estilo estándar". Casi todas las empresas en las que he trabajado tienen su propio estilo de codificación C++, y la mayoría de los proyectos de código abierto también tienen sus propios estilos.Unas pocas convenciones de codificación es posible que desee mirar:

Es interesante notar que C++ estándares de codificación se suelen especificar qué partes del lenguaje no usar. Por ejemplo, la Guía de estilo de Google C++ dice "No usamos excepciones de C++". Casi todas partes donde he trabajado han prohibido ciertas partes de C++. (Un lugar en el que trabajaba básicamente dijo, "programa en C, pero new y delete están bien"!)

+1

"programa en C, pero nuevo y eliminar están bien" - eso es abrir una gran lata de gusanos, solo para escribir 'Foo * foo = new Foo;' en lugar de 'Foo * foo = malloc (sizeof (Foo)); assert (foo); ';-) –

+0

Bueno, sí, ese era el punto. En esa compañía casi siempre usamos new y delete en lugar de malloc y free. Otro que era prácticamente solo C: no se permiten constructores, métodos, plantillas o excepciones. Estaban construyendo un software integrado y temían que pudieran necesitar acceder a una plataforma que no tenía un compilador de C++ (esto fue hace casi 15 años). –

+1

Suena loco como un sombrerero para mí. Si están preocupados de que puedan necesitar una plataforma sin C++, podrían escribir C, y obtener el beneficio de que al compilarlo con '-std = c89 -pedantic' en realidad pueden estar valiéndolo como C89, que funcionará en una C compilador, en lugar de C++, que podría no serlo. Si quisieran escribir desesperadamente "nuevo" y "eliminar", use un par de macros (admitiría que necesita paréntesis adicionales: 'eliminar (nuevo (TYPE));' en lugar de 'eliminar nuevo TYPE;'. –

14

Los más comunes que veo en el código de producción son (en este orden):

myFunctionName  // lower camel case 

MyFunctionName  // upper camel case 

my_function_name // K & R ? 

I encontrar la convención de nomenclatura que un programador usa en el código C++ generalmente tiene algo que ver con su fondo de programación.

E.g. los programadores ex-java tienden a utilizar una carcasa inferior de camello para las funciones

4

Como han dicho otros, no existe tal cosa en C++. Una vez dicho esto, tiendo a usar el estilo en el que está escrita la biblioteca estándar: K & R.

También, see the FAQ entry by Bjarne Stroustrup.

5

Personalmente, prefiero thisStyle a ThisStyle para las funciones. Esto es realmente para gusto personal, probablemente influenciado por Java, pero me gusta bastante que las funciones y clases se vean diferentes.

Si tuviera que discutirlo, diría que la distinción es algo más que estética. Se ahorra un poco de pensamiento cuando te encuentras con la construcción de estilo funcional de un temporal. En contra de eso, puede argumentar que en realidad no importa si Foo(1,2,3) es una función invocada o no; si es un constructor, entonces actúa exactamente como una función que devuelve un valor de Foo de todos modos.

La convención también evita la función-with-misma-nombre-as-a-clase-no-es-un-error fiasco que C++ hereda porque C tiene un espacio de nombres de etiquetas separadas:

#include <iostream> 

struct Bar { 
    int a; 
    Bar() : a(0) {} 
    Bar(int a) : a(a) {} 
}; 

struct Foo { 
    Bar b; 
}; 

int Bar() { 
    return 23; 
} 

int main() { 
    Foo f; 
    f.b = Bar(); 
    // outputs 23 
    std::cout << f.b.a << "\n"; 
    // This line doesn't compile. The function has hidden the class. 
    // Bar b; 
} 

Bar es, después de todo, tanto un sustantivo como un verbo, por lo que podría definirse razonablemente como una clase en un lugar y una función en otro. Obviamente, hay mejores formas de evitar el choque, como el uso adecuado de los espacios de nombres. Entonces, como digo, realmente es solo porque prefiero el aspecto de las funciones con iniciales en minúscula en lugar de porque realmente es necesario distinguirlas de las clases.

23

Desde C++ 11, es posible que desee utilizar snake_case o camelCasepara los nombres de funciones.

Esto se debe hacer un trabajo de clase como el rango de expresión en un range-based for-loop, que have to definir las funciones llamadas begin y end (mayúsculas y minúsculas) para esa clase.

En consecuencia, usando p. Ej.PascalCase para nombres de funciones significa que debe romper la consistencia de nombres en su proyecto si alguna vez necesita hacer que una clase funcione con el rango para.

+1

No estoy de acuerdo. Puede usar PascalCase para sus métodos y luego usar begin/end nombres para las clases específicas que lo requieren. Eso es exactamente lo mismo que si estuviera subclasificando una estructura de un tercero que tiene una convección de nombres diferente a la suya. – Dess

+2

@Dess: Sí, pero la mezcla resultante no lo hace mejor.Por lo tanto, si comienza un nuevo proyecto, es una recomendación de sensatez no utilizar PascalCase para nombres de funciones. –

+0

Estoy de acuerdo con @Dess –

Cuestiones relacionadas