Clases de estilo Java en c ++

8

Encontré este artículo proponiendo un estilo de codificación en c ++ que al principio parece un poco extraño. Pero después de leerlo y reflexionar un poco, realmente estoy considerando intentarlo.

El beneficio más atractivo es la facilidad de refactorizar los métodos. Me encuentro cambiando constantemente los nombres de los métodos, los parámetros, etc. mientras escribo una nueva clase y en c ++ es bastante molesto tener que cambiar el nombre de un método en dos archivos (.h, .cpp).

Traté de encontrar algo mal con este estilo, pero aparte del hecho de que el código se verá y se sentirá realmente extraño para los programadores experimentados de c ++, no puedo detectar ningún defecto importante. Pero dado que soy un programador de c ++ bastante inexperto, espero que alguien aquí pueda alertarme sobre cualquier peligro potencial.

Entonces mi pregunta es:

¿Hay algún inconveniente serio al usar este estilo de codificación?

bughi
fuente
2
Probablemente tendrá problemas con las plantillas.
Thomas Eding
1
and name mangling
freak de trinquete
@ThomasEding ¿podrías explicarnos? Cambié struct Ben el ejemplo a una plantilla y se compiló muy bien.
bughi
1
No entiendo el punto del artículo. Va contra todo lo que se considera un buen código moderno en C ++ ...
Klaim
1
Me gusta la separación de la interfaz desde la implementación. Es muy fácil leer el archivo * .h y ver la interfaz de un vistazo (porque es compacto). Probablemente nunca necesite mirar el archivo fuente a menos que esté editando el código. Unir todo en un solo archivo destruirá una de las características del lenguaje que considero más útil (así que no, gracias).
Martin York

Respuestas:

13

Sí, vas a confundir a otros programadores de C ++ si escribes todo tu código así. Nunca he visto código C ++ sin plantilla escrito de esa manera, con todo en el archivo de encabezado. Esto también se ha discutido en profundidad en una pregunta de Stack Overflow .

En cuanto a los problemas técnicos reales con él, algunas cosas me vienen a la mente.

  • Todo su código se convierte efectivamente inline. Sus tiempos de compilación probablemente aumentarán.
  • Cada compilación compilará el mundo simplemente porque tiene que hacerlo.
  • Tendrás que tener cuidado de no entrar en conflicto con la Regla de una definición . Los nombres de las variables deberán ser únicos en todos los archivos de origen, ya que efectivamente se convierte en un archivo gigante.

También es posible que desee consultar el lenguaje de programación D , que según tengo entendido resuelve muchos de estos problemas. El compilador D está diseñado con este estilo en mente y no tiene 30 años de compatibilidad con C para admitir.

Michael Kristofik
fuente
De hecho, escribimos C ++ de esa manera (todo en .h) en mis estudios universitarios de pregrado. No estoy seguro de por qué. Tuve que aprender a separar las cosas y vincularlas adecuadamente por mi cuenta.
KChaloux
9

No es exactamente una idea nueva. Los programadores principiantes evitan declaraciones como la peste, y en su mayoría se salen con la suya porque sus programas son muy pequeños. La consecuencia es que ahora debe preocuparse por el orden en que define sus funciones. La consecuencia de preocuparse por el orden de definición es la tentación de minimizar el problema al hacer que sus funciones sean demasiado grandes.

También pierde la agradable separación de la interfaz y la implementación. El propio autor lamenta que los miembros privados formen parte del archivo de encabezado, luego "resuelve" el problema al hacer que todos los detalles de implementación formen parte del archivo de encabezado.

Karl Bielefeldt
fuente
7

Si quieres clases de estilo Java, ¡entonces programa en Java !

Él hace muchas conjeturas en su artículo que son completamente erróneas. En ningún orden particular:

Tiempo de compilación

Esto tampoco es un problema. Suponiendo que tiene todos los encabezados del sistema operativo y los contenedores de uso frecuente (STL) o bibliotecas matemáticas en encabezados precompilados, y suponiendo que si su programa es realmente enorme, lo ha separado en componentes según lo anterior, la cantidad restante de código es absolutamente insignificante para Un moderno compilador de C ++.

Esto es simplemente incorrecto, y muestra que nunca ha trabajado en un programa C ++ a gran escala. Descargue cualquier programa grande de código abierto de C ++, compile el programa y dígame si desea esperar tanto tiempo cada vez que olvida un punto y coma.

Declarar antes de usar

Hay una característica de C ++ que muy pocos programadores parecen conocer (o al menos, han explotado): y es que dentro de una clase, declarar antes de que el uso no se mantenga (!). Claramente, Bjarne era consciente de este problema heredado en C ++ y lo arregló para el interior de las clases, pero no pudo hacer lo mismo para las declaraciones de nivel superior debido a la compatibilidad con C (¿por qué? Debe haber alguna complejidad que me falta aquí) .

[... mucho, mucho más, cada línea más dolorosa que la anterior ...]

Ok, en primer lugar, no es una característica que "muy pocos programadores parecen conocer". En segundo lugar, se trata de un malentendido completo de la declaración adelantada y para qué se utiliza. La guía de estilo de codificación de Google tiene una introducción bastante decente: http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Forward_Declarations

Están destinados a simplificar el compilador y reducen sustancialmente el tiempo de compilación.

Riwalk
fuente
1
Sabes, solo tuve que votar a favor de ese enlace a la Guía de estilo de Google. Es una pila gigantesca de errores. Deberíamos ponerlo en la lista negra, no vincularlo.
DeadMG
0

Me parece que solo estoy dando un nombre tonto para hacer declaraciones en lugar de hacerlo #include <blah>.

Los beneficios de las declaraciones adelantadas es que sus tiempos de compilación pueden ser significativamente más rápidos, pero el principal inconveniente de IMO es que debe tener en cuenta cuándo puede y no puede salirse con una declaración adelantada, y cuando la arruina, puede obtener mensajes de error aparentemente incomprensibles para un error trivial.

whatsisname
fuente