¿Cómo puedo aprender a escribir C ++ idiomático?

27

Soy estudiante de informática y, como resultado, me enseñaron C ++ como una mejor versión de C con clases. Termino tratando de reinventar la rueda cada vez que se necesita una solución a un problema complejo, solo para encontrar en algún momento después de eso, alguna característica del lenguaje o alguna rutina de biblioteca estándar podría haberlo hecho por mí.

Me siento cómodo con mi char*y mis *(int*)(someVoidPointer)expresiones idiomáticas, pero recientemente, después de hacer una contribución (menor) a un proyecto de código abierto, siento que no es así como se supone que uno debe pensar al escribir código C ++. Es muy diferente a C es.

Teniendo en cuenta que conozco bastante bien la programación orientada a objeciones, y estoy de acuerdo con una curva de aprendizaje empinada, ¿qué me sugerirías para que tenga mi mente en la pista de C ++ cuando estoy codificando C ++?

Yati Sagade
fuente
77
Según sus comentarios, conoce la sintaxis de C ++ y eso es todo. No estás codificando en C ++. La etiqueta C ++ en stackoverflow es un buen lugar para comenzar, incluye una lista de lectura y preguntas frecuentes . La única forma real de aprender es escribir código y obtener comentarios de usuarios experimentados. Puede poner su código aquí para su revisión. Un buen ejemplo
Martin York el
1
Junto con el consejo de @ LokiAstari (con el que estoy de acuerdo), diría que tus amigos tienen razón, y trabajar en Accelerated C ++ probablemente sería una buena idea. Sospecho que encontrará que se necesita mucho menos descremado de lo que espera: está destinado a personas en su posición, que ya conocen la programación y que necesitan aprender los modismos de C ++ moderno.
Jerry Coffin
sí, en realidad completé los primeros dos capítulos, pero las cosas allí eran principalmente lo que ya sabía: entiendo que un autor no solo saldrá y escribirá un libro para , aunque :) @LokiAstari gracias por el comentario superinformativo :)
yati sagade
3
@yatisagade No esperes que un libro te enseñe la mentalidad del idioma en un par de capítulos. Puede ser extremadamente aburrido, como ya conoce la sintaxis, pero debe comprometerse a leer un par de libros de C ++, leer todo y hacer cada ejercicio como si fuera un principiante total del lenguaje. Que te enseñen de la manera incorrecta significa que debes duplicar tus esfuerzos, ya que debes olvidar los errores y aprender los derechos (o algo así).
Yannis
1
Me siento cómodo con [...] - (int) (someVoidPointer) ¿Alguna vez ha depurado una compilación de 64 bits?
Ed S.

Respuestas:

12

Según sus comentarios, conoce la sintaxis de C ++.
No está codificando en C ++, pero a menudo se lo denomina C con clases.

La etiqueta C ++ en stackoverflow es un buen lugar para comenzar, incluye una lista de lectura y preguntas frecuentes .

La única forma real de aprender es escribir código y obtener comentarios de usuarios experimentados. Puede poner su código aquí para su revisión. Un buen ejemplo

Estoy cómodo con mis "char *" s

Deja de usarlos, cambia a std :: string.

y modismos (int) (someVoidPointer).

Deje de usarlos (aparte de la interfaz con el código C). El uso del concepto de functor proporciona varias ventajas (incluida la idea de encapsular el estado).

Pero recientemente, después de hacer una contribución (menor) a un proyecto OSS, creo que no es así como piensas en C ++. Es muy diferente, aunque C tiene su propio lugar.

Sí. C y C ++ han divergido como lenguajes. Aunque puede usar prácticamente la misma sintaxis, lo que se considera un buen código C generalmente no se considera un buen código C ++ (o viceversa).

Algunos amigos han sugerido C ++ acelerado, pero nuevamente sé qué tipos son, qué clases son y qué es la sobrecarga.

Tienes los conceptos básicos abajo.

¿Cómo puede un programador de C ++ (mutilado), que suena bien con los conceptos OO, escribir programas idiomáticos en el lenguaje?

Con mucho trabajo :-)

Martin York
fuente
Este no es el único camino. Puedes aprender mucho de buenos libros.
Dima
1
@Dima: Absolutamente. Puedes aprender mucho de los libros. Pero nada superará la experiencia y usar el lenguaje con enojo, fallar en volver a intentar fallar nuevamente y encontrar la mejor manera de hacerlo. Supongo que puedes aprender francés de un libro, pero dudo que los franceses te consideren fluido.
Martin York
66
En mi humilde opinión, la forma más eficiente de aprender es comenzar con los libros, aprender la forma correcta de hacer las cosas, probarlo en la práctica y luego hacer que alguien critique su código.
Dima
@Dima: No tengo discusión con eso.
Martin York
12

El libro Effective C ++ enseña una serie de cosas interesantes y lo llevará a apreciar las características de C ++. También existe un STL efectivo : no lo he leído, pero estoy seguro de que sería una gran lectura si no está familiarizado con el STD.

Lo importante que debe aprender es que debe hacer uso del lenguaje y no reinventar la rueda constantemente . Ya has aprendido cómo hacerlos, así que hazlo fácil para ti (¡y para los demás!) Y usa herramientas para todo su potencial.

Como nota al margen, se encontrará con muchas personas que exigen que se use la ETS. Esta es una mentalidad tan mala como solo usarla char*: a veces no es la herramienta correcta y existen muchas otras. En el mismo sentido, no se desanime de hacer sus propias clases de contenedores: si va a usar char*el mejor lugar para hacerlo, está envuelto de forma segura dentro de una clase.

Pubby
fuente
Sé sobre las series efectivas (no las he leído). Pero supongo que son para problemas de mejores prácticas, ¿verdad?
Yati Sagade 03 de
3
@yati sagade: no, esos libros son exactamente lo que necesitas para pasar de "C con clases" a C ++ completo.
Dima
Ya veo, en realidad tuve una línea efectiva de C ++ de Meyers alineada después de C ++ acelerado.
yati sagade
1
@Dima "El propósito de este libro es mostrarle cómo usar C ++ de manera efectiva. Supongo que ya conoce C ++ como lenguaje y que tiene cierta experiencia en su uso. Lo que proporciono aquí es una guía para usar el lenguaje para que su software es comprensible, mantenible, portátil, extensible, eficiente y es probable que se comporte como usted espera. "- C ++ efectivo. También cubre una serie de "trucos" que lo hacen interesante de leer.
Pubby
1
@Dima: Cuidado aquí. La segunda edición fue dirigido a los nuevos programadores C ++ procedentes de la C. (última) 3ª edición está más dirigido a los programadores procedentes de lenguajes como Java, C #, etc
sbi
6

Puedo recomendar la reciente toma BUILD dada por Herb Sutter. El llamado " Escribir código C ++ moderno: cómo C ++ ha evolucionado a lo largo de los años ":

Muchas personas piensan que C ++ es el mismo lenguaje que experimentaron en la universidad o simplemente como "C con clases", pero el lenguaje C ++ ha evolucionado ampliamente a lo largo de los años. En esta sesión, cubriremos cómo puede usar C ++ para escribir aplicaciones innovadoras, expresivas y hermosas que ofrecen aplicaciones de potencia y rendimiento. Únase a nosotros para ver cómo el estándar C ++ 0x recién terminado puede hacer que escribir C ++ sea tan productivo como muchos otros lenguajes.

No es una mala presentación, no es demasiado larga, tiene algunos buenos indicadores de las nuevas características en el último estándar que le darán algunas pistas para actualizar su antiguo estilo C / C ++.

Aparte de eso, debe aprender el STL: no es complicado y hay muchos libros, por ejemplo, STL efectivo, o simplemente google para tutoriales de STL para que pueda comenzar.

gbjbaanb
fuente
+1 gracias. Eso fue maravilloso. Estoy feliz de haber hecho esta pregunta. Tantos enlaces maravillosos :)
yati sagade
4

Leí Accelerated C ++ de Andrew Koenig y Barbara Moo para ayudarme a enseñar C ++, después de haber trabajado con C ++ durante casi una década. (De hecho, estaba empezando a jugar con la metaprogramación de plantillas en ese momento). Todavía me pareció una revelación, aunque no creo que me haya enseñado ningún hecho nuevo sobre el lenguaje. 1

Sin embargo, lo que me enseñó fue mirar y usar C ++ como lenguaje de alto nivel. Para no jugar con punteros en bruto deletey usar la biblioteca estándar siempre que sea posible.

Tengo la sensación de que esto es exactamente lo que buscas.

1 No es que no quedara nada para enseñarme en ese entonces (hay mucho incluso ahora, una década más tarde), pero solo hay tanto conocimiento que puede incluir en un libro introductorio de 250 páginas.

sbi
fuente
1

Antes de responder, una nota: Idiomatic C ++ es un objetivo en movimiento. A medida que cambia el idioma, también lo hacen sus modismos. De hecho, algunas características del lenguaje están destinadas a permitirnos eliminar el código idiomático que podría simplificarse o mejorarse con algún soporte del lenguaje en sí, o al menos la biblioteca estándar. Por lo tanto, tenga en cuenta que cualquier fuente solo puede informarle sobre lo que era idiomático al momento de escribir .

Dicho esto, harías bien en revisar:

El sitio codereview.SX

La red StackExchange tiene un sitio llamado codereview.stackexchange.com . Si ha escrito un fragmento de código C ++, una clase, una parte de una biblioteca, algo que no es demasiado grande, puede publicarlo allí y pedirle a la comunidad que lo revise. Tenga en cuenta que el código tiene que compilarse y ser básicamente funcional: ese sitio no es para depurar.

Además, puede buscar algún código de C ++ allí, relacionado con lo que está trabajando, y ver qué enfatizan los revisores. Incluso podría intentar revisar el código publicado usted mismo sin publicar una respuesta, luego leer lo que otros piensan de él.

Presentaciones en video de la conferencia C ++

Hay varias conferencias de desarrolladores centradas en C ++ cada año:

y esos ni siquiera son los únicos ... de todos modos, cada uno de estos publica videos de muchas / todas las presentaciones. Estos le enseñarán mucho , incluida una codificación idiomática, y un principio con el que puede decidir qué debería o no ser idiomático.

A veces incluso puedes obtener las cubiertas deslizantes de los altavoces.

einpoklum - reinstalar a Monica
fuente
0

Bueno, los proyectos de código abierto son un muy buen comienzo. No esperes convertirte en un programador profesional basado en tus clases universitarias, no están destinadas para eso (como escribí en mi respuesta aquí ).

Parece que conoces la sintaxis, eso es bueno. Ahora ve y lee el código de otros, y contribuye con el tuyo para las revisiones por pares. Aprenderá mucho leyendo código e intentando comprenderlo, depurándolo y reparándolo, y por supuesto, agregando a esto las convenciones de codificación que ya existen.

Los libros profesionales también son una muy buena idea, como se mencionó, y navegar por las preguntas y respuestas en StackOverflow le enseñará mucho (seguramente me enseña mucho, y me considero un profesional de C ++).

littleadv
fuente
-1

Leer un montón de buen código C ++ probablemente ayudará. Tienes que ver el código para comenzar a sentirlo. Por otra parte, la mayor parte del código de C ++ está mal.

Descifrador
fuente
"la mayor parte del código de C ++ está mal", ¿puede aclarar? He visto que la mayoría de los proyectos de OSS en realidad mantienen altos estándares de calidad.
yati sagade
1
Proyectos, sí, pero buscar en Google cómo hacer cosas a menudo conduce a malos ejemplos.
Codificador
1
@yati: Mi experiencia en proyectos de OSS es todo lo contrario.
sbi el
@sbi quizás: estuve involucrado con el proyecto Mozilla y Google Chrome (en realidad no estoy involucrado aquí, pero aprendí un poco). Encontramos su disciplina excepcional!
yati sagade
@yatisagade: Como mínimo, la mayoría del código C ++ existente se escribió cuando el lenguaje tenía características que hoy son esenciales para escribir un buen código; y la mayoría del resto fue escrito teniendo que usar bibliotecas que fueron escritas para trabajar con un código tan antiguo, por lo que este código más nuevo debe adaptarse a ellos, hasta cierto punto. Y todo esto es independientemente de si los codificadores invertir el tiempo y esfuerzo necesarios para el diseño e implementación decente ...
einpoklum - Restablecer Mónica