Noob Spotted !!
 Groupe : Membres
|
C'est cool! Par contre va falloir que je m'y mette (fainéant  )
|
Maitre KAY pour vous servir ;)
 Groupe : Membres
|
je plussoi le chapitre prochain sur linux 
sinon ca va saigner
non je rigole. en tout cas j'applaudis la regularite des news et des cours/tp
sans parler de leur diversité
|
Groupe : Membres
|
Bonjour,
C'est pas mal, mais il y a quand même quelques détails un peu ennuyeux.
Déjà ça :
Citation : mateo21
La classe "string" de la bibliothèque standard est un mauvais exemple à ne pas suivre
Même avec le smile, ça choque un peu.
Le mieux à mon sens aurait été d'utiliser un espace de nom. string existe déjà, mais pas SDZ::string.
Je remarque également que beaucoup de tes int sont en fait des unsigned int.
Des fonctions qui sont conceptuellement const ne le sont pas dans ton code. Même si tu le précises en conclusion, je ne pense pas que ce soit une bonne idée de laisser un code pas aussi propre qu'il pourrait être.
Ex : ZString longueur(const char *chaine);
Cette méthode n'est pas à sa place. Déjà, elle devrait être remplacée par cstring::strlen. Ensuite, elle devrait être privée SI elle n'a d'utilité que pour la classe elle-même.
Mais il faut que cette classe chaine dispose d'une méthode qui donne sa taille. Il faut donc une fonction ZString::longueur() const; (sans paramètre donc). Un accesseur en lecture est à 99 % du temps const.
Et d'ailleurs, les get... c'est plutôt l'usage en java, en c++ c'est plus souvent ...() (je préfère perso, c'est moins lourds et tout aussi parlant).
ZString::copie devrait être privé. Le constructeur par recopie est là pour ce genre de problématique.
ZString::afficher ne devrait pas être présent. Ca lie inutilement ZString à iostream.
Il n'est pas plus long d'écrire :
ZString str = "abc";
std::cout << str.getChaine();
Que :
ZString str = "abc";
str.afficher();
De plus, comment fais-tu pour écrire sur std::cerr ? Tu ne peux pas passer par ZString::afficher.
En règle générale d'ailleurs, tu devrais à mon avis éviter les using namespace std;. Ca encombre l'espace de nom global.
Et gagner 5 caractères en remplaçant std::cout par cout n'a pas un intérêt suffisant pour encombrer l'espace de nom global.
En résumé, il y a beaucoup à dire sur ce code. Je ne suis pas certain que tu es choisi un bon sujet de TP : même si ça n'en a pas l'air, écrire une classe chaine est beaucoup plus compliqué qu'il n'y parait de primer abord.
Je serais content de te lire si tu réponds à ce post. J'ai écrit ça rapidement, certaines choses sont peut-être discutables.
|
Doh ! Nuts. Mmh, donuts !


|
Je suis parfaitement conscient de ces petites imperfections et je les assume pleinement. Je m'attendais à des réponses de ce genre, car le sujet est complexe et obtenir un truc "parfait" aux yeux de tous relève de la mission impossible.
Néanmoins, je pense avoir mené à bien une mission d'ordre pédagogique en écrivant ce tuto. Tu n'as fait en général que relever des erreurs (qui n'en sont pas, c'est juste que ça fait pas trop "best practices" je te l'accorde) qui sont induites par la méthode pédagogique. Il y a par exemple le fait de ne pas avoir mis de méthode constante. Je ne pouvais faire autrement n'ayant pas expliqué ce concept auparavant, mais je rectifie le tir en conclusion en expliquant qu'il faudra améliorer ça.
Quant à la méthode afficher, elle n'a pas de sens non plus, sauf que pour mon tuto j'ai besoin d'une méthode d'affichage avant de surcharger le <<. Toi tu ne vois pas le problème de la même manière, tu te dis "il est con, pourquoi il a pas surchargé << de suite ?". Moi je le vois d'une toute autre manière : je conçois l'écriture de manière linéaire de telle sorte que je puisse expliquer au mieux le processus de réflexion qui me permet d'écrire une telle classe.
En revanche, j'avais laissé une erreur (le delete[]), cela a été corrigé immédiatement dès que ça m'a été signalé.
Je ne prétends pas écrire la classe parfaite pour la gestion des string. C'était pas mon but. J'espère au moins avoir aidé grâce à ce TP beaucoup de gens pour qu'ils comprennent le processus de création d'une classe, le concept "les attributs sont propres à l'objet", etc etc.
Techniquement, je suis complètement d'accord avec toutes tes remarques. Je me les étais déjà faites dans ma tête. Pédagogiquement je ne peux pas tout faire et je suis obligé de faire ces compromis.
Tu trouveras plus d'informations sur ma façon de concevoir les tutoriels sur cette page :
http://www.siteduzero.com/savoirplus.html#tutoriels
|
Groupe : Membres
|
Bonjour,
Bon tuto, mais j'ai quand même une petite remarque à faire en ce qui concerne la surcharge de l'opérateur + (et même de == ou != ). çà n'aurait pas été plus intéressant, au lieu de faire un simple copier-coller, de faire :
Code : C++ - Afficher / masquer les numéros de ligneZString ZString::operator+(const ZString &chaine)
{
return operator+(chaine.m_chaine); //on appelle la méthode ZString::operator+(const char* chaine)
}
Qu'en pensez-vous?
|
le C++, j'en mange!
 Groupe : Bannis
|
Citation : GoD++Bonjour,
Bon tuto, mais j'ai quand même une petite remarque à faire en ce qui concerne la surcharge de l'opérateur + (et même de == ou != ). çà n'aurait pas été plus intéressant, au lieu de faire un simple copier-coller, de faire :
Code : C++ - Afficher / masquer les numéros de ligneZString ZString::operator+(const ZString &chaine)
{
return operator+(chaine.m_chaine); //on appelle la méthode ZString::operator+(const char* chaine)
}
Qu'en pensez-vous? ça s'appelle du vol, ce que tu viens de faire! j'ai signalé ça avant toi: http://www.siteduzero.com/tuto-50-28807.html ( c'est peut etre le hasard!)
|
4 8 15 16 23 42
 Groupe : Membres
|
Citation : total chaosça s'appelle du vol, ce que tu viens de faire! j'ai signalé ça avant toi
Faut pas abuser non plus, c'est pas parce qu'il a eu la même idée que toi qu'il t'as forcément "volé" ton post. Surtout que c'est même pas la même fonction :\
|
Groupe : Membres
|
sorry! pas fait exprès! 
|
Groupe : Membres
|
Citation : M@teo21Je suis parfaitement conscient de ces petites imperfections et je les assume pleinement. Je m'attendais à des réponses de ce genre, car le sujet est complexe et obtenir un truc "parfait" aux yeux de tous relève de la mission impossible.
Je m'attendais également à une réponse de ce genre.
Citation
Néanmoins, je pense avoir mené à bien une mission d'ordre pédagogique en écrivant ce tuto. [...] je conçois l'écriture de manière linéaire de telle sorte que je puisse expliquer au mieux le processus de réflexion qui me permet d'écrire une telle classe.
Il est vrai que l'aspect pédagogique (et le public visé) rende l'exercice très difficile, pour ne pas dire impossible.
CitationJe ne prétends pas écrire la classe parfaite pour la gestion des string. C'était pas mon but. J'espère au moins avoir aidé grâce à ce TP beaucoup de gens pour qu'ils comprennent le processus de création d'une classe, le concept "les attributs sont propres à l'objet", etc etc.
Je n'avais pas vu le problème via cet angle. Ta démarche est effectivement cohérente.
Citation
Techniquement, je suis complètement d'accord avec toutes tes remarques. Je me les étais déjà faites dans ma tête. Pédagogiquement je ne peux pas tout faire et je suis obligé de faire ces compromis.
Il y a juste un "détail" que tu pourrais corriger tout en restant pédagogique : using namespace std. cout tout seul, ce n'est pas une bonne pratique selon moi. Et expliquer le pourquoi du comment de manière pédagogique et accessible, moi je n'en serai pas capable, mais toi si.
Les méthodes qui sont publiques alors qu'elle devrait être privées, tu pourrais améliorer ceci, non ?
|
Doh ! Nuts. Mmh, donuts !


|
Pour ces points là c'est effectivement améliorable, j'essaierai de m'en occuper en fin de semaine si j'ai le temps 
Pour les méthodes privées, je le signalerai probablement à la fin pour ne pas surcharger mes explications dans le fil du tuto.
|
le C++, j'en mange!
 Groupe : Bannis
|
Citation : GoD++sorry! pas fait exprès!  pas grave, j'ai pas dit ça dot le but de t'offenser. hein?;
|
le C++, j'en mange!
 Groupe : Bannis
|
autre truc amliorable: aulieu de faire deux constructeur comme ça:
Code : C++ - Afficher / masquer les numéros de ligneZString(); // Constructeur par défaut (crée une chaîne vide "")
ZString(const char *chaine); // Constructeur surchargé (crée la chaîne envoyée)
tu peux faire comme ça :
Code : C++ - Afficher / masquer les numéros de ligneZString(const char *chaine = 0);
afin de revoir les param facultatifs!
|
Gorille bourré


|
CitationD'autre part, on bénéficie des outils puissants du C++ comme la surcharge des opérateurs. Cela nous permet d'écrire des choses intuitives comme :
Code : C++ - Afficher / masquer les numéros de lignestring nom = "Mateo";
string maChaine = "Bonjour " + nom; // Vaudra "Bonjour Mateo"
Non. Tu n'écriras jamais string maChaine = "Bonjour " + nom; en C++. Ne pas écrire des choses dans les règles de l'art pour simplifier la compréhension pour le lecteur, OK, écrire des choses fausse, c'est moins bien :P
|
Ex-Admin
 Groupe : Membres
|
Sauf s'il surcharge l'operator+ global
Edit: /
|
Doh ! Nuts. Mmh, donuts !


|
Citation : MackilaCitationD'autre part, on bénéficie des outils puissants du C++ comme la surcharge des opérateurs. Cela nous permet d'écrire des choses intuitives comme :
Code : C++ - Afficher / masquer les numéros de lignestring nom = "Mateo";
string maChaine = "Bonjour " + nom; // Vaudra "Bonjour Mateo"
Non. Tu n'écriras jamais string maChaine = "Bonjour " + nom; en C++. Ne pas écrire des choses dans les règles de l'art pour simplifier la compréhension pour le lecteur, OK, écrire des choses fausse, c'est moins bien :P
Ooops, personne ne l'avait vue celle-là non plus.
C'est vicieux faut dire
Merci je corrige dans la minute.
|
Ex-Admin
 Groupe : Membres
|
Je suppose que tu as vu mon commentaire concernant l'auto-affectation. Etant donné que c'est quelque chose qui revient quasiment tout le temps dans la création de classe, ne serait-il pas intéressant de le signaler, si pas directement dans le TP, en commentaire à la fin? Ca peut vraiment pourrir la vie ce genre de chose 
|
Doh ! Nuts. Mmh, donuts !


|
Euh non j'ai dû zapper je vais lire. Je pense que ça peut se mentionner sans problème vers la conclusion, par contre en milieu de tuto si c'est un détail un peu délicat je préfèrerai éviter.
|
Groupe : Membres
|
un tres bon tp, bravo pour ce choix
|
!? encore un Layus... Groupe : Membres
|
Coucou,
Un message un peu en retard...
(il faut m'excuser, j'étais en vacances)
Je suis fort étonné que le constructeur de copie fasse appel à la méthode "longueur()" dans ce code :
Citation :
Ne serait-il pas plus simple de faire:
Code : C++ - Afficher / masquer les numéros de lignem_longueur = chaine.m_longueur;
ou alors j'ai loupé une marche...
encore merci pour les tutos...
Merci d'avoir pris le temps de me lire,
Layus
Nihil sum...
|
Doh ! Nuts. Mmh, donuts !


|
C'est corrigé merci.
|
Groupe : Membres
|
Citation : DHKoldJe suppose que tu as vu mon commentaire concernant l'auto-affectation. Etant donné que c'est quelque chose qui revient quasiment tout le temps dans la création de classe, ne serait-il pas intéressant de le signaler, si pas directement dans le TP, en commentaire à la fin? Ca peut vraiment pourrir la vie ce genre de chose 
J'interviens ici, je viens d'en parler dans les commentaires du tuto.
Il y a effectivement une (deux avec la copie) erreur(s) dans l'opérateur d'affectation, mais pas le test pour contrer l'auto-affectation. (Je l'ai même félicité de ne pas être tombé dans ce piège :P)
Ce test est un contre idiome qui résout un problème qui a moins de chances de se produire que l'autre problème qu'il ne résoud pas ( exception-safety), et en plus cette approche est pessimiste.
Je t'invite à consulter la FAQ C++ de developpez, ou de faire des recherches ici, sur developpez, ou sur fclc++.
|
Ex-Admin
 Groupe : Membres
|
Ah bah merci de me le faire remarquer, je viens de lire le point dans la FAQ de developpez  Très intéressant, et ça montre que ce qu'on apprend en cours n'est pas toujours efficace 
|
Groupe : Membres
|
"A jour" serait plus juste 
|