
Envoyé par
Taurre
Ah ? Il me semblait au contraire qu'il démontrait qu'il était simple de les éviter avec une telle méthode. Tu peux développer ton point de vue ?
Commençons par le plus simple: quelle connaissance dois tu avoir pour comprendre la structure et la fonction, selon toi

En fait, tu dois déjà avoir pas mal de connaissance:
- ce qu'est un pointeur
- ce qu'est la différence entre la pile et le tas
- ce que fait la fonction malloc
ce que fait le mot clé goto- ce que fait la fonction free
- les risques que tu prend en cas de dépassement de mémoire
Pour tout développeur C un tout petit peu habitué, cela n'a l'air de rien, mais cela implique, pour le type qui veut apprendre C, qu'il doit s'intéresser à une série de concepts très importants (en C du moins) pour arriver à le comprendre.
Ceci étant posé (et je présume que tu ne me contrediras sur ce point

), posons nous une deuxième question: quand faudra-t-il que celui qui apprend C s'intéresse au point précédent

La réponse a presque de quoi choquer, car, en gros, c'est "dés que l'étudiant voudra écrire une nouvelle fonction", et, si on reprend purement le code que tu donnes en exemple, c'est encore pire, car la réponse devient "dés qu'il voudra gérer une chaine de caractères ton il ignore
a priori la taille".
Autrement dit: très tôt dans l'apprentissage, car il aura à peine eu le temps d'apprendre ce qu'est une boucle et un test
Si l'on trace la boucle d'apprentissage, tu as donc (ce n'est qu'un résumé de ce que j'ai écrit quelques intervention plus haut

)
- apprendre à écrire la fonction main: ca prend cinq minutes
- apprendre à écrire une boucle: allez, ca prend un quart d'heure pour voir les trois types de boucles
- apprendre à écrire un test: dix minutes pour avoir les tests simple et les tests de type switch case

Jusque là, il n'y a pas grand chose de compliqué, je crois que tu seras du même avis que moi

Puis d'un seul coup, tu va lui dire "oui, mais, attention, il faut gérer les ressources", et tu vas, littéralement, devoir l'assommer avec les notions que j'ai citées au début de mon intervention, c'est à dire avec des notions réellement complexes et particulièrement importantes.
Et après, tu vas reprendre avec des notions comme les structures dynamiques (pile, file et autres) "simples", à condition d'avoir assimilé les notions complexes, "casse gu...le" si, par malheur, il ne les a pas assimilées.
Regardons maintenant la courbe d'apprentissage de C++...
- on apprend à écrire la fonction main : cinq minutes (elle ne change pas de C, finalement
) - on apprend les différentes boucles : un petit quart d'heure, (idem)
- on apprend les différentes sortes de test: c'est toujours 10 minutes
- On a besoin d'une chaine de caratère
on introduit std ::string, et il faut même pas commencer à s'inquiéter des fonctions membres - Il est plus que temps de pouvoir utiliser des collections!! on introduit celles de la STL ("vous inquiétez pas de push_back, utilisez le, on en parle plus tard
) - Il faut commencer à convertir des données de différents types
on introduit stringstream (vous inquiétez pas de str(), ca viendra en meme temps que push_back
) - Le passage d'argument commence vraiment à faire lourd: on introduit les références (c'est un alias de la variable que vous passez en argument, très compliqué, n'est-ce pas
) - et on pourrait continuer comme cela

Il y a parfaitement moyen de voir en C++ l'ensemble du paradigme impératif sans avoir à s'inquiéter de la gestion des ressources (et la gestion de la mémoire est sans doute la pire bête noir des débutants

)
Bien sur, on a "laisser quelques trucs de coté", mais, ou est le problème

Le fait que l'étudiant n'ait pas forcément conscience de ce que fait push_back au niveau de la mémoire est il handicapant

Sommes toutes, beaucoup moins qu'on ne pourrait le croire

En plus, on a une transition toute trouvée pour aborder le paradigme OO: "Ah, au fait, il est temps de nous intéresser à push_back et à str... Ce sont des fonctions membres".
Hé oui, C++ est un langage qui utilise le paradigme Orienté Objet: C'est un paradigme qui s'intéresse plus aux services qu'un objet peut rendre qu'aux données qui lui permettent de rendre ce service.
De fil en aiguille, on arrive au besoin d'héritage, bien sur...
Et ce n'est qu'à ce moment là qu'il devient intéressant de parler de pointeur et de tout ce qui s'y rapporte.
Mais les problèmes de syntaxe sont déjà assimilés depuis longtemps, et l'on a meme sans doute eu déjà largement l'occasion de s'habituer à un grand nombre d'erreurs lancées par le compilateur

Il est alors peut etre temps de revenir un peu plus en détail sur des fonctions comme push_back pour leur faire se rendre compte de l'impact d'une telle fonction en mémoire

ET s'il reste encore un peu de temps à l'horaire, on peut envisager d'aborder le paradigme générique

Au final, la courbe d'apprentissage est beaucoup plus souple et régulière que ce que l'on aurait eu en C
6 |
0 |