La programmation en C++ moderne

Apprenez la programmation de zéro jusqu'à l'infini !

a marqué ce sujet comme résolu.

Bonjour à tous,

J’ai commencé (il y a 3 semaines, 2 jours) la rédaction d’un tutoriel dont l’intitulé est La Programmation en C++ moderne.

J’aimerais obtenir un maximum de retour sur celui-ci, sur le fond ainsi que sur la forme, afin de proposer en validation un texte de qualité.

Si vous êtes intéressé, cliquez ci-dessous

Merci d’avance pour votre aide

+4 -0

Oui je poste juste pour suivre l'avancement du tuto

Sinon Phigger, tu as le bouton Suivre ce sujet :)

A la limite, ce n'est pas une mauvaise chose que vous passiez directement le tuto en bêta. Cela vous permettra d'avoir tout de suite des retours. Votre texte ne pourra en être que meilleur !

Bon courage aux 4 auteurs pour la rédaction !

Merci beaucoup :) C'est ce qu'on s'est dit : que plus tôt on a des retours, plus on pourra améliorer le cours, c'est pourquoi on a finalement décidé de le mettre rapidement en beta.

Oui, j'ai aussi le bouton, mais autant laisser un petit message aux auteurs ^^

Phigger

Tout à fait d'accord pour le message d'encouragement, ça fait toujours plaisir ;)

+0 -0

Bonjour,

et merci de lire ce message ;)

Je pense que ce serait bien de mettre un lien vers la documentation genre vers cppreference sur la partie concernée (vecteur, tupple, boucle, …) surtout dans les chapitres qui concernent la STL.

Sinon dans les liens pour débuter, un lien vers des documentations (cppreference, cpp.com), Coliru, 2-3 forums (ZdS, OC ?, Dev.com ?), la FaQ de Dev.com (qu'est plutôt bien foutu), p'tet GitHub ?, … Je ne pense qu'il faut faire télécharger un IDE dès le début, Coliru peut suffire pour commencer non ? (ou dans ce cas bien préciser que le compilo fournit avec C::B est dépassé). Bon courage pour la suite !

  1. On mettra un lien vers la doc cppreference dans le second chapitre, mais le reste du temps ils se debrouilleront pour faire leurs recherches dans la doc.
  2. Bonne idee pour la faq et les forums, merci :)
  3. Github, ce sera dans la partie dediee aux outils.
  4. Pb des compilos en ligne : coliru ne gere pas l entree standard, ideone ne gere pas les flux vers les fichiers. On a dc fait le choix de proposer en telechargement une version de code blocks preconfiguree par mes soins pour le debut, avant d entree en details dans le fonctionnement de la compil et dans la configuration des outils.
  5. Merci :)
+0 -0

Ma définition d'historique : sans RAII – beaucoup n'en sont encore que là. L'appellation est particulièrement pertinente pour les livres. Il peut y avoir des livres de C++98 qui ne sont pas des livres de C avec le mot clé class. Ceux là (C/C++), on tend à les appeler les "historiques", mais c'est parce que l'on est consensuel en ne disant pas juste "mauvais", voire pire. Et ces livres de C++98 modernes ne sont pas mauvais. C'est juste qu'ils ne permettent pas de profiter des derniers apports du C++.

const est plus subtil que ça.
Il rend la variable constante si définie à partir d'une expression qui poeut être évaluée lors de la compilation. Sinon, elle est juste non modifiable.

Je n'aime pas assigné. La traduction usuelle est affecté.

Pour la complexité du C++, il n faut pas perdre de vue qu'elle n'est pas qu'inhérente au langage. C'était le point de ma préface pour le livre de Philippe "Koala01" Dunski.

Ma critique ne porte pas tant sur le fond en tant que tel, mais sur l'organisation générale de votre cours. Et elle se décompose en deux points.

L'intro

Tout d'abord, votre chapitre introductif « Le C++, qu'est-ce que c'est ? » est vraiment lourd. Pas à cause de sa rédaction, mais parce que son contenu est une énième répétition de l'intro classique d'un big-tuto sur un langage.

Votre explication sur les qualités d'un bon programmeur se trouve dans le cours de C et aussi, même si vous ne pouvez pas encore le voir, dans le cours de Swift qui devrait arriver en bêta d'ici quelques semaines. Et comble de malheur, vous parvenez à avoir trois explications différentes dans trois tutos ! Bonjour la cohérence…

Quant à votre explication sur ce que sont un programme et la programmation, le fait que vous repreniez in extenso le texte du tuto de C ne fait que mettre en évidence à quel point il s'agit là d'une redite du tuto sur Swift, de celui sur Ada, ou encore de celui sur Ruby.

J'en avais déjà parlé dans le sujet préparatoire à ce tuto, nous sommes en cours de rédaction d'un cours sur les notions de base de chaque paradigme. Mais celui-ci n'abordera pas les bases des bases, à savoir précisément, ce que sont un programme, la programmation de manière générale et l'algorithmique. Il me paraîtrait donc judicieux qu'on s'y mette à plusieurs pour écrire un mini-tuto qui présente ces notions de base et puisse servir d'introduction à tous les tutos sur un langage donné. Cela permettrait d'alléger le vôtre et de ne pas relire quinze fois les mêmes explications, mais avec des approximations différentes.

Le plan

Ensuite, le plan tombe dans le même travers que le cours de C, celui sur Swift, celui sur Rust, celui sur Ruby, celui sur Java, celui sur Ada ou celui sur COBOL : ce n'est tout simplement pas un cours !

Votre présentation du langage est structurée de manière à ce qu'un programmeur confirmé y retrouve ses petits, pas selon une logique d'apprentissage progressif et d'acquisition de compétences : vous documentez le langage, vous ne l'enseignez pas !

Vous découpez le langage en classes d'outils, en partant de la vue d'ensemble que vous en avez, et vous présentez chacune de ces classes d'outils de manière à peu près exhaustive à la suite. Ce faisant, vous encombrez l'esprit de l'apprenant de toutes sortes de notions qui ne lui seront pas utiles avant un long moment, rendant ainsi l'apprentissage plus compliqué. Par exemple, dans le chapitre sur les variables.

  • Quelle est l'utilité des suffixes de littérale à un moment de l'apprentissage où votre lecteur ne sait même pas modifier la valeur d'une variable ? Sérieusement, que va-t-il en faire ?
  • De même, vous n'aborderez pas les fonctions avant encore trois chapitres : quel besoin aura donc votre lecteur de connaître les références ? Même quand il connaîtra les fonctions, vu qu'il ne connaît pas encore les structures de données composites, aura-t-il réellement besoin de références ou peut-il s'en passer encore pendant un moment ? Surtout les subtilités sur la constance d'une référence à une non constante…
  • L'inférence de type est sûrement très intéressante, mais elle n'a clairement pas sa place aussi tôt dans le cours. D'ailleurs, vous êtes obligés de laisser de côté la moitié de vos explications, parce que vous sentez bien que votre lecteur n'a pas le niveau. En outre, l'inférence de type utilisée à tort et à travers est une mauvaise pratique, mais vous ne pouvez certainement pas expliquer pourquoi à quelqu'un qui sait à peine manipuler des variables : il serait plus sage d'attendre d'être plus avancé dans le cours pour parler de cette notion à double tranchant.

Une bonne logique d'apprentissage consiste à vous demander ce que vous voulez que votre lecteur soit capable de réaliser (en termes pompeux, les compétences que vous voulez qu'il acquière), par exemple des programmes de plus en plus complexes que vous voulez qu'il soit capable de programmer par ses propres moyens. Et ensuite, de lui enseigner les outils dont il a besoin pour réaliser cette tâche, et guère plus que cela. C'est uniquement ainsi que vous parviendrez à mettre en place une progression qui ait du sens du point de vue de l'apprenant et non de votre point de vue d'experts.

Ainsi, votre chapitre sur la POO part déjà dans le mur. Vous vous dites « ouais, quand même, serait peut-être temps de parler de la POO, allez, on la met là ! » au lieu de vous demander « quels types de problèmes mon lecteur sera-t-il incapable de résoudre correctement sans POO ? » et de choisir le moment de l'aborder et l'approche en fonction de ce besoin de l'apprenant, et non, encore une fois, selon vos envies d'experts.

Et il en va de même pour la STL. Elle est là pour proposer un ensemble d'outils répondant à des besoins, il est donc plus judicieux de présenter ces outils lorsque votre apprenant en aura besoin que d'en faire un catalogue plus ou moins exhaustif lorsqu'il maîtrise à peine les bases, catalogue qui ne lui donnera aucune idée de l'utilité pratique de tous ces outils.

C'est comme si après vous avoir enseigné les bases de la cuisine (éplucher les patates, cuire un œuf, etc.) on vous faisait un inventaire détaillé de tous les ustensiles et ingrédients d'une cuisine sur-équipée, ainsi que des fonctions des différents robots de cuisine : vous auriez la tête surchargée d'informations diverses, mais vous seriez toujours aussi incapables de réaliser un risotto ou un tiramisu. ;)

Quelques points plus spécifiques

En plus de ces deux gros points, j'ai relevé quelques « détails » supplémentaires.

Il est multi-paradigme : il n'impose pas une façon unique de concevoir et découper ses programmes mais laisse le développeur libre de ces choix. Nous verrons dans ce tutoriel plusieurs de ces paradigmes.

C'est faux. Je sais que c'est un argument marketing pour vendre un langage de dire qu'il est multi-paradigme, mais faut arrêter de le mettre à toutes les sauces. Le C++ est un langage objet : toute la STL utilise des objets, les versions récentes s'efforcent d'enterrer les scories impératives du C (tableaux simples, pointeurs, etc.) pour les remplacer par des équivalents objets et une programmation trop procédurale est considérée comme une mauvaise pratique.

Et ce ne sont pas les tentatives faiblardes d'intégrer quelques outils de la programmation fonctionnelle (sérieusement, les tuples du C++ sont juste abominablement compliqués par rapport à ceux d'un langage fonctionnel… >_< ) dans les versions récentes du langage qui suffisent à en faire un langage multi-paradigme. Rust est multi-paradigme, Scala est multi-paradigme, Scheme est multi-paradigme, Mercury est multi-paradigme, mais pas C++.

entierRef2 = entier2; //erreur ! une référence doit toujours désigner la même variable !

Pourquoi erreur ? Quelques lignes plus haut, vous avez modifié la valeur d'une variable par le biais de sa référence en lui affectant une littérale : pourquoi ne serait-il pas possible de modifier la valeur d'une variable par le biais de sa référence en lui affectant la valeur d'une autre variable ?

IV - Les outils nécessaires pour créer de vrais projets

Toute cette section me paraît superflue. Le fonctionnement de la compilation, les outils de base du développeur et l'intérêt d'un IDE, ou encore la bonne gestion d'un projet, ce sont des notions transversales à tous les langages, et elles devraient faire l'objet de cours à part, généralistes. Par exemple, gdb s'utilise de la même manière quel que soit le langage dans lequel on a programmé, et son utilisation fine mérite un cours complet. Vos explications seront au mieux incomplètes et redondantes.

Les conteneurs

J'ose espérer que ce chapitre n'est qu'une ébauche qui sera retravaillée…

+0 -0

@Dominus Carnufex, je suis d'accord sur beaucoup de choses qui ont été dites. Mais pas sur les définitions.

La STL n'est pas OO. Stepanov, son créateur s'en défend – j'ai des articles et des videos éventuellement (mais il faudra me le rappeler dans une semaine). La séparation algorithmes et données, est justement une direction à l'opposée du mouvement dans l'OO qui consiste à mettre données et opérations ensemble (principe de localité si j'ai bien compris les mots de A.Kay). Donc, non. Le C++ est aussi OO, mais pas que OO. D'ailleurs, une programmation trop procédurale n'est pas taguée comme une erreur de conception en C++. La généricité n'appartient pas au paradigme OO. Le C++ ne couvre pas forcément proprement tous les paradigmes, mais il en couvre plusieurs. Par définition, il est multi-paradigme.

M'enfin bon.

Pour les chaines de compilation. Le modèle du C++ n'est pas transversal à tous les langages. Par contre, il est partagé avec le C. Dans ces deux, il y a une notion d'unité de traduction (ou de compilation selon les traducteurs), et elle est essentielle à comprendre relativement à l'édition des liens. Il y aura d'ailleurs des éléments communs avec le C, mais beaucoup de nouveaux qui sont propres au C++.

EDIT: A. Kay a souvent critiqué le C++ comme non OO. Dans ses définitions, Java n'est pas OO non plus d'ailleurs. Et surtout, je viens de tomber sur ce billet: http://arne-mertz.de/2015/07/c-is-not-an-object-oriented-language

Merci beaucoup pour vos avis.

L'intro

L'idée d'un tutoriel reprenant ces bases me paraît en effet assez judicieuse, en effet. Je discuterai avec les auteurs pour voir comment alléger l'intro.

Le plan

(…)

Votre présentation du langage est structurée de manière à ce qu'un programmeur confirmé y retrouve ses petits, pas selon une logique d'apprentissage progressif et d'acquisition de compétences : vous documentez le langage, vous ne l'enseignez pas !

Vous découpez le langage en classes d'outils, en partant de la vue d'ensemble que vous en avez, et vous présentez chacune de ces classes d'outils de manière à peu près exhaustive à la suite. Ce faisant, vous encombrez l'esprit de l'apprenant de toutes sortes de notions qui ne lui seront pas utiles avant un long moment, rendant ainsi l'apprentissage plus compliqué. Par exemple, dans le chapitre sur les variables.

C'est comme si après vous avoir enseigné les bases de la cuisine (éplucher les patates, cuire un œuf, etc.) on vous faisait un inventaire détaillé de tous les ustensiles et ingrédients d'une cuisine sur-équipée, ainsi que des fonctions des différents robots de cuisine : vous auriez la tête surchargée d'informations diverses, mais vous seriez toujours aussi incapables de réaliser un risotto ou un tiramisu. ;)

C'est pas faux :hum:

C'est faux. Je sais que c'est un argument marketing pour vendre un langage de dire qu'il est multi-paradigme, mais faut arrêter de le mettre à toutes les sauces. Le C++ est un langage objet : toute la STL utilise des objets, les versions récentes s'efforcent d'enterrer les scories impératives du C (tableaux simples, pointeurs, etc.) pour les remplacer par des équivalents objets et une programmation trop procédurale est considérée comme une mauvaise pratique.

Pas tout à fait d'accord. La manière du C++ d'aborder certains paradigmes a ses désavantages, mais il les aborde quand même.

entierRef2 = entier2; //erreur ! une référence doit toujours désigner la même variable !

Pourquoi erreur ? Quelques lignes plus haut, vous avez modifié la valeur d'une variable par le biais de sa référence en lui affectant une littérale : pourquoi ne serait-il pas possible de modifier la valeur d'une variable par le biais de sa référence en lui affectant la valeur d'une autre variable ?

Il était très tard, j'étais fatigué en l'écrivant… On m'a fait remarqué cette erreur, je n'ai juste pas eu le temps de la corriger.

IV - Les outils nécessaires pour créer de vrais projets

Toute cette section me paraît superflue. Le fonctionnement de la compilation, les outils de base du développeur et l'intérêt d'un IDE, ou encore la bonne gestion d'un projet, ce sont des notions transversales à tous les langages, et elles devraient faire l'objet de cours à part, généralistes. Par exemple, gdb s'utilise de la même manière quel que soit le langage dans lequel on a programmé, et son utilisation fine mérite un cours complet. Vos explications seront au mieux incomplètes et redondantes.

Je pense qu'il est important de l'abomrder quand même.

Les conteneurs

J'ose espérer que ce chapitre n'est qu'une ébauche qui sera retravaillée…

Dominus Carnufex

Ce sera largement retravaillé, ce n'est même pas une ébauche.

experts

C'est un petit peu exagéré ;)

+1 -0

Je n'ai pas lu le tuto complet (je le ferais quand il sera beaucoup plus avancé), mais 2 remarques suite à la relecture d'artragis :

" C++ est un langage extrèmement rapide" <- préciser "lors de l'exécution"

Je n'aime pas trop cette simplification "le C++ est rapide", parce que cela laisse penser qu'écrire un programme en C++ permet d'avoir un programme plus rapide. Or, cela dépendra souvent en premier lieu du choix des structures de données et des algos que du langage lui même.

Je préfère la remarque suivante :

C++ doesn’t give you performance, it gives you control over performance.

Chandler Carruth, Efficiency with Algorithms, Performance with Data Structures, CppCon 2014.

"C++ est portable, c'est à dire qu'un programme développé dans ce langage peut être compilé pour fonctionner sur différentes machines sans devoir changé ledit code." meme si aujourd'hui ce n'est pas faux, tu vas te faire des ennemis. :p

Ok, mais avec deux bémols. En C++, on arrive très rapidement à devoir utiliser des libs externes (réseaux, xml, graphisme, etc). La portabilité d'un programme C++ dépendra alors aussi de la portabilité des libs.

De plus, on arrivera très rapidement aussi à devoir quand même écrire du code plateforme spécifique. Par exemple parce que même si notre programme C++ compile sans problème sur Android et iOS, il faudra prendre en compte les différences en termes d'affichages (résolution, densité, etc). Ou alors prendre en compte le hardware (bas-niveau, embarqué, optimisation, etc).

Mais le point important est que cela n'est pas une problématique spécifique au C++, mais à tous les langages de programmation, du fait de l'hétérogénéité du hardware, des systèmes d'exploitation, des compilateurs (en particulier du support des normes C++), etc.

Disons que le C++ n'est pas moins portable que d'autres langages, qu'il existe de nombreux système qui ont un compilateur C++, qu'un code C++ pure sera compilable directement sur la majorité des compilateurs C++ (avec quelques ajustements, en fonction du support des normes C++), qu'il est généralement facile (si le code est correctement conçu) d'isoler les parties du code plateforme-spécifique, etc…

+4 -0

Bonjour à tous.

Tout d'abord, merci beaucoup à tous, parce que vous prenez du temps pour lire, relire, prendre des notes et nous les communiquer. Personnellement, j'apprécie beaucoup l'intérêt porté à ce tutoriel rt votre aide pour l'améliorer.

Je suis sur téléphone actuellement, je ne peux pas répondre précisément à toutes les remarques, mais sachez que je les prends toutes en compte et que j'y réfléchis beaucoup, notamment celle comme quoi ce n'est pas un cours pour débutant ; après tout ce temps à y réfléchir, c'est entièrement vrai, donc avec mes co-rédacteurs nous allons y réfléchir pour voir comment changer.

Salut à tous ! je viens de lire le début de votre tuto est quelques questions me viennent. Il est écrit : > Ce cours a donc pour vocation de vous donner des bases et non de faire de vous un expert. vous voulez dire que ce cours est ouvert à tous ? ou il faudrait mieux deja savoir programmer un tout petit peu ?

Mise à part ca le reste du tuto, en tout cas pour le débutant que je sui clair, on perd pas le nord en lisant, et les explications sont claires (sauf pour les tableaux mais je ne connaissais pas alors c'est normal)

Je voulais vous demandais, un tuto sur une bibliotheque graphique est il prévu ? ou bien quelque chose de type SFML(peut etre un autre tuto ?) serait vraiment sympa je trouve et cela apporterait un plus je pense, bien sur cela représente de travail en plus et je suis conscient que vous n'avez pas beaucoup de temps.

voila mes impressions pour le moment je n'ai pas d'autres choses à dire et si j'en ai j'editerais ce post ! Bonne continuations !

Bonjour à tous,

Me voilà de nouveau, mais sur ordinateur, ça va être plus simple et pratique pour écrire. Alors tout d'abord, c'est vrai que l'introduction sur ce qu'est un programme est redondante. C'est ça l'inconvénient d'avoir le nez plongé dans ses affaires, on ne pense pas à regarder ailleurs. Je vais essayer de voir avec tous les auteurs des différents tutoriels pour essayer de produire rapidement un tutoriel (un article ?) sur les programmes et comment ils fonctionnent. Également sur ce qu'est la programmation et l'algorithmique.

Par contre, est-ce que le tutoriel sur les paradigmes sera bientôt disponible ? Ou à défaut, en bêta ? Je pense que l'on en aura besoin pour savoir comment s'organiser, quoi dire, ne pas dire pour ne pas se répéter.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte