Comment apprendre à écrire du C ++ idiomatique?

27

Je suis un étudiant en informatique, et en conséquence, j'ai appris le C ++ comme une meilleure version de C avec des cours. Je finis par essayer de réinventer la roue chaque fois qu'une solution à un problème complexe est nécessaire, pour trouver quelque temps après cela, une fonctionnalité de langage ou une routine de bibliothèque standard aurait potentiellement pu le faire pour moi.

Je suis tout à fait à l'aise avec mes idiomes char*et *(int*)(someVoidPointer), mais récemment, après avoir apporté une contribution (mineure) à un projet open-source, je pense que ce n'est pas ce que l'on est censé penser lors de l'écriture de code C ++. C'est très différent de C.

Étant donné que je connais assez bien la programmation orientée objet et que je suis d'accord avec une courbe d'apprentissage abrupte, que suggéreriez-vous pour que je me mette à l'esprit sur la piste C ++ lorsque je code C ++?

yati sagade
la source
7
Sur la base de vos commentaires, vous connaissez la syntaxe C ++ et c'est tout. Vous ne codez pas en C ++. La balise C ++ sur stackoverflow est un bon point de départ, elle comprend une liste de lecture et une FAQ . La seule vraie façon d'apprendre est d'écrire du code et de faire commenter un utilisateur expérimenté. Vous pouvez mettre votre code ici pour révision. Un bon exemple
Martin York
1
Avec les conseils de @ LokiAstari (avec lesquels je suis d'accord), je dirais que vos amis ont raison, et travailler sur Accelerated C ++ serait probablement une bonne idée. Je suppose que vous constaterez que beaucoup moins d'écrémage est nécessaire que vous attendez - il est destiné aux personnes dans votre position, connaissant déjà la programmation et ayant principalement besoin d'apprendre les idiomes du C ++ moderne.
Jerry Coffin
oui, en fait, j'ai terminé les deux premiers chapitres, mais le contenu était principalement ce que je savais déjà - je comprends qu'un auteur ne sortira pas et n'écrira pas un livre pour moi , cependant :) @LokiAstari merci pour le commentaire super informatif :)
yati sagade
3
@yatisagade Ne vous attendez pas à ce qu'un livre vous apprenne la mentalité de la langue en quelques chapitres. Cela peut être extrêmement ennuyeux, car vous connaissez déjà la syntaxe, mais vous devez vous engager à parcourir quelques livres C ++, à tout lire et à faire chaque exercice car vous étiez un débutant total dans le langage. Apprendre dans le mauvais sens signifie que vous devez doubler vos efforts, car vous devez oublier les torts et apprendre les droits (ou quelque chose comme ça).
yannis
1
Je suis tout à fait à l'aise avec [...] - (int) (someVoidPointer) Avez-vous déjà débogué une version 64 bits auparavant?
Ed S.

Réponses:

12

Sur la base de vos commentaires, vous connaissez la syntaxe C ++.
Vous ne codez pas en C ++ mais ce qui est souvent référencé comme C avec des classes.

La balise C ++ sur stackoverflow est un bon point de départ, elle comprend une liste de lecture et une FAQ .

La seule vraie façon d'apprendre est d'écrire du code et de faire commenter un utilisateur expérimenté. Vous pouvez mettre votre code ici pour révision. Un bon exemple

Je suis à l'aise avec mes "char *"

Arrêtez de les utiliser, passez à std :: string.

et (int) (someVoidPointer) idiomes.

Arrêtez de les utiliser (sauf pour interfacer avec le code C). L'utilisation du concept de foncteur offre plusieurs avantages (dont l'idée d'encapsuler l'état).

Mais récemment, après avoir apporté une contribution (mineure) à un projet OSS, je pense que ce n'est pas ce que vous pensez en C ++. C'est très différent, bien que C ait sa propre place.

Oui. C et C ++ ont divergé en tant que langages. Bien que vous puissiez utiliser pratiquement la même syntaxe, ce qui est considéré comme un bon code C n'est généralement pas considéré comme un bon code C ++ (ou vice versa).

Certains amis ont suggéré le C ++ accéléré, mais encore une fois, je sais quels sont les types, quelles sont les classes et ce qu'est la surcharge.

Vous avez les bases même.

Comment un programmeur C ++ (mutilé), qui se trouve être sain avec les concepts OO, peut-il écrire des programmes idiomatiques dans le langage.

Avec beaucoup de travail :-)

Martin York
la source
Ce n'est pas le seul moyen. Vous pouvez apprendre beaucoup de bons livres.
Dima
1
@Dima: Absolument. Vous pouvez apprendre beaucoup de livres. Mais rien ne battra l'expérience et l'utilisation de la langue dans la colère, à défaut d'essayer à nouveau d'échouer et de trouver la meilleure façon de le faire. Je suppose que vous pouvez apprendre le français dans un livre, mais je doute que le français vous considère couramment.
Martin York
6
À mon humble avis, la façon la plus efficace d'apprendre est de commencer par les livres, d'apprendre la bonne façon de faire les choses, de l'essayer dans la pratique, puis de demander à quelqu'un de critiquer votre code.
Dima
@Dima: Je n'ai aucun argument avec ça.
Martin York
12

Le livre Effective C ++ enseigne un certain nombre de choses intéressantes et vous amènera à apprécier les fonctionnalités de C ++. Il existe également une STL efficace - je ne l'ai pas lu, mais je suis sûr que ce serait une excellente lecture si vous ne connaissez pas la STD.

La chose importante à apprendre est que vous devez utiliser la langue et ne pas réinventer la roue en permanence . Vous avez déjà appris à les fabriquer, alors faites-vous plaisir (et aux autres!) Et utilisez les outils à leur plein potentiel.

En guise de remarque, vous rencontrerez beaucoup de gens qui demandent l'utilisation de la MST. C'est tout aussi mauvais état d'esprit que d'utiliser char*- parfois ce n'est pas l'outil correct et il y en a beaucoup d'autres. Dans le même sens, ne vous découragez pas de créer vos propres classes de conteneurs - si vous allez utiliser char*le meilleur endroit pour le faire, il est enveloppé en toute sécurité dans une classe.

Pubby
la source
Je connais la série efficace, (je ne les ai pas lus) - Mais je suppose que ce sont des problèmes de bonnes pratiques, non?
yati sagade
3
@yati sagade: non, ces livres sont exactement ce dont vous avez besoin pour passer du "C avec classes" au C ++ à part entière.
Dima
Je vois - en fait, j'avais un c ++ efficace de Meyers aligné après Accelerated C ++.
yati sagade
1
@Dima "Le but de ce livre est de vous montrer comment utiliser efficacement le C ++. Je suppose que vous connaissez déjà le C ++ en tant que langage et que vous avez une certaine expérience dans son utilisation. Ce que je fournis ici est un guide d'utilisation du langage afin que votre logiciel est compréhensible, maintenable, portable, extensible, efficace et susceptible de se comporter comme prévu. "- C ++ efficace. Il couvre également un certain nombre de "pièges" qui le rendent intéressant à lire.
Pubby
1
@Dima: Attention ici. La 2ème édition était destinée aux nouveaux programmeurs C ++ venant de C. La (dernière) 3ème édition est plutôt destinée aux programmeurs venant de langages comme Java, C # etc.
sbi
6

Je peux recommander la récente prise de CONSTRUCTION donnée par Herb Sutter. Celui intitulé " Ecrire du code C ++ moderne: comment C ++ a évolué au fil des années ":

Beaucoup de gens pensent que le C ++ est le même langage qu'ils ont vécu au collège ou tout simplement comme le «C avec les classes», mais le langage C ++ a beaucoup évolué au fil des ans. Dans cette session, nous verrons comment vous pouvez utiliser C ++ pour écrire des applications innovantes, expressives et belles qui fournissent des applications de puissance et de performance. Rejoignez-nous pour voir comment la nouvelle norme C ++ 0x peut rendre l'écriture C ++ aussi productive que de nombreux autres langages.

Ce n'est pas une mauvaise présentation, pas trop longue, a de bons pointeurs vers les nouvelles fonctionnalités de la dernière norme qui vous donneraient quelques conseils pour mettre à jour votre ancien style C / C ++.

En dehors de cela, vous devez apprendre la STL - ce n'est pas compliqué et il y a beaucoup de livres, par exemple, Effective STL, ou simplement google pour les didacticiels STL pour vous aider à démarrer.

gbjbaanb
la source
+1 Merci. C'était merveilleux. Je suis content d'avoir posé cette question. Tant de liens merveilleux :)
yati sagade
4

J'ai lu Accelerated C ++ par Andrew Koenig et Barbara Moo afin de m'aider à enseigner le C ++, après avoir travaillé avec C ++ pendant près d'une décennie. (En fait, je commençais à bricoler avec la méta-programmation de modèles à ce moment-là.) J'ai toujours trouvé que c'était une révélation, même si je ne pense pas que cela m'a appris de nouveaux faits sur le langage. 1

Ce que cela m'a appris, cependant, était de regarder et d'utiliser le C ++ comme langage de haut niveau. Ne pas bricoler avec des pointeurs bruts et deleteet utiliser la bibliothèque standard autant que possible.

J'ai le sentiment que c'est exactement ce que vous recherchez.

1 Ce n'est pas qu'il ne restait plus rien à m'apprendre à l'époque (il y en a encore beaucoup aujourd'hui, une décennie plus tard), mais il y a tellement de connaissances que vous pouvez insérer dans un livre d'introduction de 250 pages.

sbi
la source
1

Avant de répondre - une note: Idiomatic C ++ est une cible mobile. À mesure que la langue change, ses idiomes changent également. En fait, certaines fonctionnalités du langage sont destinées à nous permettre de supprimer le code idiomatique qui pourrait être simplifié ou amélioré avec une certaine prise en charge par le langage lui-même, ou au moins la bibliothèque standard. Gardez donc à l'esprit que toute source ne peut que vous informer sur ce qui était idiomatique au moment de la rédaction .

Cela dit, vous feriez bien de vérifier:

Le site codereview.SX

Le réseau StackExchange possède un site nommé codereview.stackexchange.com . Si vous avez écrit un morceau de code C ++ - une classe, une partie d'une bibliothèque, quelque chose de pas trop énorme - vous pouvez le poster là-bas et demander à la communauté de le réviser. Notez que le code doit être compilé et être fondamentalement fonctionnel - ce site n'est pas destiné au débogage.

Vous pouvez également y rechercher du code C ++, lié à ce sur quoi vous travaillez, et voir ce que les réviseurs mettent en évidence. Vous pouvez même essayer de réviser le code publié vous-même sans poster de réponse, puis de lire ce que les autres en ont pensé.

Présentations vidéo de conférence C ++

Chaque année, plusieurs conférences de développeurs axées sur le C ++ sont organisées:

et ce ne sont même pas les seuls ... de toute façon, chacun de ces messages vidéos de plusieurs / toutes les présentations. Ceux-ci vous en apprendront beaucoup , y compris un codage idiomatique et un principe avec lequel vous pourrez décider ce qui doit ou ne doit pas être idiomatique.

Parfois, vous pouvez même obtenir les diapositives des haut-parleurs.

einpoklum - réintégrer Monica
la source
0

Eh bien, les projets open source sont un très bon début. Ne vous attendez pas à devenir un programmeur professionnel basé sur vos cours universitaires, ils ne sont pas destinés à cela (comme je l'ai écrit dans ma réponse ici ).

Vous semblez être au courant de la syntaxe, c'est bien. Maintenant, allez lire le code des autres et contribuez le vôtre pour les évaluations par les pairs. Vous apprendrez beaucoup en lisant le code et en essayant de le comprendre, en le déboguant et en le corrigeant, et bien sûr - en y ajoutant en respectant les conventions de codage qui existent déjà.

Les livres professionnels sont également une très bonne idée, comme mentionné, et parcourir les questions et réponses sur StackOverflow vous en apprendra beaucoup (cela m'apprend sûrement beaucoup et je me considère comme un professionnel C ++).

littleadv
la source
-1

La lecture de beaucoup de bon code C ++ sera probablement utile. Vous devez voir le code pour commencer à vous en faire une idée. Là encore, la plupart du code C ++ est incorrect.

Codeur
la source
"la plupart du code C ++ est faux" - pouvez-vous clarifier? J'ai vu que la plupart des projets OSS maintiennent en fait des normes de qualité élevées.
yati sagade
1
Des projets, oui, mais googler sur la façon de faire des choses mène souvent à de mauvais exemples.
Coder
1
@yati: Mon expérience concernant les projets OSS est le contraire.
sbi
@sbi peut-être - j'ai été impliqué dans le projet Mozilla et Google Chrome (pas vraiment impliqué ici, mais genre d'apprentissage). J'ai trouvé leur discipline exceptionnelle!
yati sagade
@yatisagade: À tout le moins, la plupart du code C ++ existant a été écrit alors que le langage avait des fonctionnalités qui sont aujourd'hui essentielles pour écrire du bon code; et la plupart du reste a été écrit en utilisant des bibliothèques qui ont été écrites pour fonctionner avec un code plus ancien, donc ce code plus récent doit être adapté à elles, dans une certaine mesure. Et tout cela indépendamment du fait que les codeurs investissent le temps et les efforts nécessaires pour une conception et une mise en œuvre décentes ...
einpoklum - réintègre Monica