Ça m'énerve, les nouveautés du C++11 ne font que complexifier le langage plus qu'autre chose.
Si tu trouve C++03 plus simple que C++11, c'est parce que tu n'en a pas fait assez. Parce que avant que C++11 ou que Boost existe, il y avait de quoi criser.
Quand en C++11 tu déplace tes objets, en C++03 tu émule ça avec de la copie de pointeurs ce qui fait que ton programme est une gigantesque soupe de pointeurs qui ne demande qu'a leaker ou à planter si tu à oublié de mettre à jour ce pointeur là dans un coin. Ajoute des programmeurs inexpérimentés et/ou un problème compliqué à résoudre et c'est comme ça qu'on se retrouve avec des monstres que personne ne peut maintenir. J'ai même pas besoin de citer une suite bureautique ou un navigateur web qui était dans ce cas là, vous savez très bien de quoi je parle.
Et on peut en citer d'autres: combien de redéfinitions se sont transformés en surcharges sans aucun warning de la part du compilateur ? Combien de programmeurs se sont fait avoir par le parsage de de C++ qui transforme des appels de fonctions en déclarations sans effets ? Combien de réimplementations buggées de pointeurs partagés avec comptage de références ? Combien de boucles chiantes avec un typedef et deux iterateurs juste pour parcourir un vecteur ?
Si tu n'a pas passé assez de temps à te battre contre ton compilateur, contre des leaks ou contre tes collègues, c'est sûr que tu ne comprendra jamais pourquoi les concepteurs de C++ ont décidé d'écouter la communauté de programmeurs C++ et d'améliorer considérablement leur quotidien.
Mais comment voulez vous que des programmeurs apprennent et aient en tête les mille et une fonctionnalités du langage ?
On pourrai dire la même chose de tout les langages modernes. Et même les langages qui n'évoluent pas (comme C) ont leur usages qui se complexifient. On est plus en 1990. On ne peut plus se dire programmeur C et ne pas savoir utiliser des pointeurs sur fonctions.
Beaucoup de projets font volontairement le choix d'utiliser qu'un sous-ensemble plus ou moins restreint du langage, pour que la barrière d'entré reste relativement basse.
Des règles similaires existent même pour du code C, c'est juste qu'elles ne sont souvent pas écrites. les projets GTK n'autorisent pas le même code que le noyau Linux.
J'ai l'impression qu'ils (les auteurs de la norme C++11) essayent de faire des mécanismes pour obtenir du code ultra-générique mais ne se rendent pas compte que la contre partie est très importante.
La généricité dans C++11 ne prend pas une place aussi importante que ce que tu lui donne. la généricité supplémentaire de C++11, c'est les constexpr, les decltype, les paramêtres templates par défaut pour les méthodes et les static_asserts. Ce n'est qu'une petite partie de C++11. Même encore aujourd'hui, la plupart du code générique que j'écris pouvait déjà être fait en C++03.
C++11, c'est aussi auto, les foreach, les override/final, les regex, les threads, les déplacements, les pointeurs intelligents, et plein d'autres fonctionnalités qui ne rendent pas ton code plus générique mais qui rendent le langage bien plus agréable à utiliser.
D'une part, le besoin de faire un code générique ne se rencontre que rarement, et d'autre part, ont perd souvent beaucoup en lisibilité et simplicité.
en C c'est pareil: on à jamais absolument besoin de séparer son code en fonctions indépendantes. Et quand on le fait, on perd en simplicité, on augmente le nombre de ligne et il faut naviguer dans plusieurs fonctions pour savoir ce que le code fait. Et en plus c'est souvent inutile vu que la plupart des fonctions ne sont appelées qu'à un seul endroit dans le code.
Mais bon sang, c'est quand même bien plus maintenable comme ça. Séparer en fonction me garanti que le code qui gère la base de donnée ne va pas interférer avec le code qui gère le réseau. Ça permet d'en prendre des bouts et de les réutiliser ailleurs.
La généricité en C++11 c'est pareil. Si je sais que mon code générique se contente de passer une valeur sans savoir ce que c'est, je suis sûr qu'elle n'y touchera pas. Ça permet d'apporter bien plus de garanties et de lisibilité à ce que mon programme fait. Et si j'applique ça à tout mon code, alors mon code ne sera qu'un ensemble de briques indépendantes que j'ai assemblé d'une certaine façon pour répondre à un besoin particulier.
Alors oui on peut coder à la mode des années 1980, en C sans utiliser de pointeurs, ça sera sans doute plus simple à comprendre pour des étudiants, mais dès que le programme se complexifiera un peu, il n'y aura guerre que l'auteur original pour y comprendre encore quelque chose.
[^] # Re: Syntaxe étonnante
Posté par Batchyx . En réponse au journal C++Now 2014. Évalué à 10.
Si tu trouve C++03 plus simple que C++11, c'est parce que tu n'en a pas fait assez. Parce que avant que C++11 ou que Boost existe, il y avait de quoi criser.
Quand en C++11 tu déplace tes objets, en C++03 tu émule ça avec de la copie de pointeurs ce qui fait que ton programme est une gigantesque soupe de pointeurs qui ne demande qu'a leaker ou à planter si tu à oublié de mettre à jour ce pointeur là dans un coin. Ajoute des programmeurs inexpérimentés et/ou un problème compliqué à résoudre et c'est comme ça qu'on se retrouve avec des monstres que personne ne peut maintenir. J'ai même pas besoin de citer une suite bureautique ou un navigateur web qui était dans ce cas là, vous savez très bien de quoi je parle.
Et on peut en citer d'autres: combien de redéfinitions se sont transformés en surcharges sans aucun warning de la part du compilateur ? Combien de programmeurs se sont fait avoir par le parsage de de C++ qui transforme des appels de fonctions en déclarations sans effets ? Combien de réimplementations buggées de pointeurs partagés avec comptage de références ? Combien de boucles chiantes avec un typedef et deux iterateurs juste pour parcourir un vecteur ?
Si tu n'a pas passé assez de temps à te battre contre ton compilateur, contre des leaks ou contre tes collègues, c'est sûr que tu ne comprendra jamais pourquoi les concepteurs de C++ ont décidé d'écouter la communauté de programmeurs C++ et d'améliorer considérablement leur quotidien.
On pourrai dire la même chose de tout les langages modernes. Et même les langages qui n'évoluent pas (comme C) ont leur usages qui se complexifient. On est plus en 1990. On ne peut plus se dire programmeur C et ne pas savoir utiliser des pointeurs sur fonctions.
Des règles similaires existent même pour du code C, c'est juste qu'elles ne sont souvent pas écrites. les projets GTK n'autorisent pas le même code que le noyau Linux.
La généricité dans C++11 ne prend pas une place aussi importante que ce que tu lui donne. la généricité supplémentaire de C++11, c'est les constexpr, les decltype, les paramêtres templates par défaut pour les méthodes et les static_asserts. Ce n'est qu'une petite partie de C++11. Même encore aujourd'hui, la plupart du code générique que j'écris pouvait déjà être fait en C++03.
C++11, c'est aussi auto, les foreach, les override/final, les regex, les threads, les déplacements, les pointeurs intelligents, et plein d'autres fonctionnalités qui ne rendent pas ton code plus générique mais qui rendent le langage bien plus agréable à utiliser.
en C c'est pareil: on à jamais absolument besoin de séparer son code en fonctions indépendantes. Et quand on le fait, on perd en simplicité, on augmente le nombre de ligne et il faut naviguer dans plusieurs fonctions pour savoir ce que le code fait. Et en plus c'est souvent inutile vu que la plupart des fonctions ne sont appelées qu'à un seul endroit dans le code.
Mais bon sang, c'est quand même bien plus maintenable comme ça. Séparer en fonction me garanti que le code qui gère la base de donnée ne va pas interférer avec le code qui gère le réseau. Ça permet d'en prendre des bouts et de les réutiliser ailleurs.
La généricité en C++11 c'est pareil. Si je sais que mon code générique se contente de passer une valeur sans savoir ce que c'est, je suis sûr qu'elle n'y touchera pas. Ça permet d'apporter bien plus de garanties et de lisibilité à ce que mon programme fait. Et si j'applique ça à tout mon code, alors mon code ne sera qu'un ensemble de briques indépendantes que j'ai assemblé d'une certaine façon pour répondre à un besoin particulier.
Alors oui on peut coder à la mode des années 1980, en C sans utiliser de pointeurs, ça sera sans doute plus simple à comprendre pour des étudiants, mais dès que le programme se complexifiera un peu, il n'y aura guerre que l'auteur original pour y comprendre encore quelque chose.