Cómo conciliar las convenciones de nomenclatura comunes de C++ con las de las bibliotecas


La mayoría de las convenciones de nomenclatura de C++ dictan el uso de camelCaseIdentifiers: nombres que comienzan con una letra mayúscula para las clases (Person, Booking) y nombres que comienzan con una letra minúscula para campos y variables (getPrice(), isValid(), largestValue). Estas recomendaciones están completamente en desacuerdo con las convenciones de nomenclatura de la biblioteca de C++, que implican nombres en minúsculas para las clases (string, set, map, fstream) y names_joined_with_an_underscore para métodos y campos (find_first_of, lower_bound, reverse_iterator, first_type). Complicando aún más la imagen son funciones del sistema operativo y de la biblioteca de C, que implican nombres en minúsculas comprimidos en C y Unix y funciones que comienzan con una letra en mayúscula en Windows.

Como resultado, mi código es un desastre, porque algunos identificadores usan la biblioteca C++, C o la convención de nomenclatura del sistema operativo, y otros usan la convención C++ prescrita. Escribir clases o métodos que envuelvan la funcionalidad de la biblioteca es doloroso, porque uno termina con nombres de estilo diferente para cosas similares.

Entonces, cómo ¿reconcilias estas convenciones de nombres dispares?

Author: vines, 2008-12-08

10 answers

Una forma de adoptar el C++ naming_convention, esto es lo que la mayoría de los ejemplos de código en la literatura hacen hoy en día.

Lentamente veo que estas convenciones se mueven hacia el código de producción, pero es una batalla contra las convenciones de nomenclatura de MFC que aún prevalecen en muchos lugares.

Otras diferencias de estilo que luchan contra los viejos estándares están usando guiones bajos finales en lugar de m_ para denotar miembros.

 18
Author: Motti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-07 20:23:59

Diomidis, comparto tu dolor y he pasado mucho tiempo cambiando entre diferentes esquemas a lo largo de los años, tratando de encontrar algo que funcione con las diferentes bibliotecas/frameworks que uso (MFC y/o STL/Boost). Cuando se trabaja con un único framework, como el STL, se puede intentar copiar la convención de nomenclatura que utiliza, pero cuando se introduce un framework diferente, se desmorona fácilmente.

Al final he adoptado un estilo único para todo el código nuevo que escribo (basado en las pautas de estilo de Google C++) y refactorizo código antiguo para usar este estilo cuando sea apropiado. No puede conciliar las diferentes convenciones de nomenclatura muy fácilmente, así que no pierda tiempo intentándolo. Aplique un esquema para su equipo / departamento./ company y apégate a ella, pero no te quedes colgado de lo 'feo' que puede verse el código cuando usas una mezcla de esquemas.

Las directrices de Google C++ son bastante buenas en mi humilde opinión, con algunas modificaciones menores. Echa un vistazo a la guía aquí:

Http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml

 22
Author: Rob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-08 19:05:47

¿Por qué la necesidad de reconciliarse? Siempre y cuando el código se compile, y se puede hacer el trabajo, no se preocupe por ello.

 6
Author: Jim Buck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-08 18:50:24

Tiendo a ser un perfeccionista cuando se trata de estilo de código, y esto siempre me ha molestado. Desearía que hubiera un estándar universal, pero no lo hay. En mi carrera profesional, he encontrado que mientras los programadores en un proyecto individual sean consistentes, eso es lo mejor que puedes esperar.

En última instancia, creo que se trata de saber de qué biblioteca proviene un método, objeto o función. Si sabes eso, entonces se vuelve bastante fácil recordar qué convención es utilizado por esa biblioteca, asumiendo que el proyecto no incluye muchas bibliotecas. He intentado adaptar mi propio código para que coincida con el de las bibliotecas que uso, pero siempre es un objetivo en movimiento y simplemente frustrante al final.

 4
Author: Sydius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-08 18:49:48

Fav cita::

Lo mejor de los estándares es que hay muchos para elegir!

Mi sugerencia sería tomar la convención de la biblioteca que ocurre en el código de su empresa con mayor frecuencia (probablemente la biblioteca C++, a la que creo que boost también se adhiere), y hacer que su estándar. De lo contrario, también podría no tener uno en absoluto.

 2
Author: T.E.D.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-08 18:50:50

En los proyectos en los que estoy trabajando sigo las convenciones de código para mi proyecto. Cuando llamo a otra cosa utilizo la API de esa biblioteca.

También agregaría que envolver la biblioteca es una mala idea (hay muchos de ellos en el código base en el que estoy trabajando) porque generalmente lo hace el desarrollador que resuelve su propio problema y, por regla general, es inapropiado para el uso de todos los demás desarrolladores. Desde el otro lado, el embalaje de alta calidad es caro.

 2
Author: sergtk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-08 18:58:20

Bueno, ya que no podemos cambiar la forma en que se implementan las bibliotecas estándar, supongo que tendremos que vivir con ello. En cuanto a la reconciliación, mientras escribía algunas cosas de la API de Win32 hace un tiempo, intenté nombrar mis propios métodos en PascalCasing como se hace en la API, pero simplemente no me sentí bien. Así que volví a nombrar mis métodos en camelCase. Estoy de acuerdo en que es un desastre, pero la otra opción es adaptar su estilo a cada nuevo marco o biblioteca que use, y luego está el problema que menciona tener más de una biblioteca usando diferentes convenciones en un solo proyecto. Así que mi consejo es-se adhieren a lo que se siente bien para sus propios métodos y clases. O, cuando se encuentre en un entorno corporativo, siga las mejores prácticas y directrices de su empresa.

 2
Author: Boyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-08 18:58:39

Me parece recordar haber leído hace mucho tiempo que optaron por hacer que la biblioteca estándar sea diferente de la convención de codificación recomendada a propósito, para evitar colisiones de nombres. Sin embargo, no puedo encontrar ninguna referencia que mencione eso ahora. Recuerdo haber leído que no debería usar letras minúsculas iniciales en los nombres de tipo porque estaban reservados para las bibliotecas estándar. Supongo que algo similar está pasando con el uso de guiones. Realmente no veo varias convenciones de nombres como un problema, ya que separa claramente el código estándar del código en su proyecto. Siempre codifico cosas en mis proyectos usando capital camel case para tipos y lower camel case para métodos / miembros. Mi lugar de trabajo actual utiliza capital camel case para métodos además de tipos, lo que me molesta mucho. Pero, también les gustan las verrugas húngaras, que incluso MS ha repudiado: P

 2
Author: rmeador,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-08 19:35:32

Honestamente, solo usaría la biblioteca tal cual y me apegaría a su propio estilo de codificación. Usted podría envolverlo, pero eso parece exagerado.

 2
Author: Bernard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-08 19:46:17

Deberías aceptar la diferencia.

Cuando la gente vea el uso de remove_copy_if, inmediatamente sabrán que esto es un algoritmo. Esto es realmente una característica positiva ya que los algoritmos vienen con ciertas garantías (o falta de).

También usamos la convención de nomenclatura para nuestros propios algoritmos personalizados.

 1
Author: Richard Corden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-07 21:10:08