OVH Cloud OVH Cloud

ostringstream effacer

65 réponses
Avatar
Ael Rowan Terence
Pardonnez moi d'avance, je sais que le sujet à déjà été abordé, mais j'ai du
mal à comprendre.

Quelle procédure employer pour effacer le contenu d'un ostringstrem ?

5 réponses

3 4 5 6 7
Avatar
James Kanze
On Jul 6, 11:52 am, "Christophe Lephay"
wrote:

2- On s'en fout que ce soit plus rapide ou non tant qu'il n'est pas
établi
(via un profiling) qu'on a besoin de quelque chose de rapide.


Ha bon ! si "on s'en fout" , je me demande pourquoi même tu l'é voques.


Je résumais ce que disait james, pas ce que je disais moi.


Attention ! Je n'ai jamais dit que je m'en foutais des
performances. C'est seulement que tout à un prix. Chercher à
améliorer les performances quand il n'y en a pas besoin, c'est
jeter l'argent par la fenêtre. Et puis, l'expérience montre que
sans mesurer, on se trompe de toute façon sur où il faut
investire l'effort. Ça ne vaut pas que pour les performances.
C'est classique aussi de vouloir rendre tout générique, pour
prevenir des changements futurs. Or que l'expérience montre
aussi que tu ne peux pas les prevoir ; les changements
toucheront inévitablement des choses que tu n'as pas prévu,
tandis que certains changements que tu as prévus ne serviront
jamais. La règle donc, c'est d'abord d'écrire le code le plus
simplement et le plus clairement possible ; plus c'est simple,
et plus c'est clair, plus il serait facile d'effectuer n'importe
quelle modification qui s'avère nécessaire par la suite.

Et tout ce que j'ai essayé à dire ici (et que j'ai peut-être mal
dit, de façon à ce que certains se sont sentis offusqués, ce qui
n'était pas le but), c'est :

-- *si* le but, c'est d'avoir un ostringstream à l'état neuf,
la façon la plus simple et la plus claire de le faire, c'est
d'en prendre un neuf (et je pense, souvent, que quand on
parle d'« effacer » un composant aussi complex qu'un
ostringstream, c'est de ça qu'on veut), et

-- justement, les ostringstream sont complex, avec un état non
trivial, et qu'il faut bien reflechir à ce qu'on veut
réelement.

Je ne voulais pas critiquer Ael Rowen ; je ne sais pas dans
quel but il veut « effacer ». Mais la question se pose assez
souvent que élaborer certaines considérations me semblait a
propos.

Ensuite, la discussion s'est dérivée sur ce que c'est
l'abstraction d'un flux. Là aussi, je crois que ça vaut la peine
qu'on y pense, ne serait-ce que pour sa propre compréhension.
Mais je suis bien d'accord avec Sylvain qu'on est des
programmeurs pratiques, et qu'on adapte les abstractions à nos
besoins du moment. Le tout, c'est de comprendre ce qu'on fait,
de le documenter, et de le faire en sorte que les attentes de
celui qui suit ne seront pas trompées. (Et le surcharge des
opérateurs comme << et >> fait naitre certaines attentes.)

--
James Kanze (Gabi Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



Avatar
James Kanze
On Jul 6, 10:41 pm, Sylvain wrote:
James Kanze wrote on 06/07/2007 11:27:
C'est un peu plus que ça, parce que parmi l'état visible de
std::vector, il y a bien std::vector<>::capacity(). Et son effet
sur les garanties des itérateurs.


je n'ai pas regardé la dépendance des std::itérateurs envers la cap acité
d'une collection mais j'espère qu'il n'en existe pas (pas trop); un
itérateur doit se soucier du nombre d'éléments contenus, pas du nom bre
maximal possible.


Ça dépend de la collection, mais il y a bien des dépendances
pour std::vector. Plutôt dans l'autre sens, en revanche : toute
augmentation de la capacité invalide tous les itérateurs.

Mais plus généralement, je pensais à une différence pas
forcement directement visible, mais qui peut avoir un effet
notable : le fait justement qu'il ne libère pas la mémoire. Tu
crée un vecteur avec une million d'éléments, puis tu fais
clear(), et tu lui insères un seul élément. Il utilise toujours
la mémoire pous une million.


pourquoi serait-ce la règle, ou plutôt une erreur obligeatoire ??


C'est ce que la norme exige. On peut ne pas être d'accord, mais
c'est comme ça. (C'est d'ailleurs pourquoi j'utilise le nom
« reset », plutôt que « clear », quand je veux une fonction
qui ramène l'objet à l'état initial. Parce que quelqu'un qui
pense en termes de la bibliothèque standard ne s'attend pas à ce
que ce soit l'effet de clear.)

[...]
C'est justement à cause de ces effets pas trop visible que
j'insiste : si tu veux un objet à l'état vièrge, il faut en
créer un nouveau.


une grosse partie de la discussion vient de cette
(re)formulation que tu fais de la question initiale!


Je l'ai réformulé comme ça parce que souvent, c'est ce qu'on
veut quand on démande d'effacer un flux. On a souvent pas pris
en compte toute la complexité de l'objet.

C'est aussi pourquoi j'ai dit *SI* tu veux un objet à l'état
vièrge. Il peut y avoir des cas où on tient même à garder
l'information de formattage, par exemple (formatter des
flottants pour un tableau GUI me vient à l'ésprit). Il peut y
avoir aussi des cas où on est amené à réutiliser un flux pour
des raisons de performances (après avoir effectué des mesures,
etc.) ; dans ces cas-là, il faut bien comprendre qu'il y a un
état assez complex, et qu'il n'y a pas vraiment de fonction pour
le ramener à l'état initial. C'est donc qu'il faut bien
considérer ce qu'on a fait avant avec ce flux, avant de s'y
lancer. Ce n'est pas beau, mais s'il n'y a pas d'autre solution
pour y arriver, il faut y passer.

non cela peut ne pas se justifer, si je génére un XML, je
ne vais pas me taper (systématiquement) une méthode pour
définir chaque attribut texte à formatter. si je génére un
DER, je ne vais pas (systématiquement) me taper une méthode
pour encoder chaque data object.


Si je génère un XML, je vais générer le schéma complet dans un
seul flux, non ? Sans jamais le resetter. S'il me faut un flux
à part, je crois bien que j'en ferais une fonctionne à part.


XML n'est pas le meilleur exemple, des objets non primitifs ASN.1 en
seraient de meilleurs, je voulais indiquer un cas où chaque attribut
doit être construit via un flux (local à cet attribut) avant de pouvo ir
injecter l'attribut complet dans le flux principal unique (par exemple
parce que la taille globale de l'attribut est nécessaire pour cette
injection) sans que l'on souhaite pour autant créer des méthodes pour
chaque attribut.


Je comprends, mais dans mes encodeurs BER, j'encode chaque type
dans une fonction à lui. S'il lui faut un flux pour le faire
(rarement le cas, parce que c'est un encodage binaire, et les
flux s'oriente text), ce flux serait bien local à la fonction.

Je ne dis pas que le cas que tu as présenté ne peut pas se
présenter, mais j'ai du mal à voir quand il se présenterais dans
la pratique.

mais j'imagine la plupart du temps que la situation serait
l'inverse : que j'ai une fonction pour générer les attributes
(par exemple), et que cette fonction prend un ostream& en
entrée.


dans le cas simple ce sera suffisant (pour du texte au kilomètre, pas
nécessairement pour des structures emboitées).

dans un cas un peu moins trivial où, par exemple, les éléments pouv ant
être traités seront injectés mais où les éléments ne pouvant pas l'être
(quelque que soit la raison de cette impossibilité) ne le seront pas
tout en garantissant l'intégrité / l'exactitude du flux global ce sera
bcp plus périlleux (au minimum double parcours pour tout tester avant de
commencer l'injection, puis injection effective), je préfère
définitivement un flux local (réutilisable) qui sera conditionnelleme nt
injecté dans le flux principal.


J'ai du mal à voir où est le problème, mais sans doute assez
d'exemple concret dépassera ce qu'on pourrait raisonablement
poster ici.

--
James Kanze (Gabi Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



Avatar
Michael Doubez
On 6 juil, 21:56, Sylvain wrote:
Michael DOUBEZ wrote on 06/07/2007 13:55:



Mon principe personnel est la règle de l'étonnement minimum:


et tu l'appliques à chercher à nous étonner par tes cheminements ?


Dans ce cas , ce ne serait pas un etonnement minimal.


1. Un collègue ne devrait pas être étonné:
Tiens, il a mis une méthode reset()?
il doit y avoir une raison pour ça, je vais chercher...non, rien.


comme celui d'imaginer que *nécessairement* si quelqu'un ose une méth ode
non coutumière des standards, il le fera a) dans son coin, b) sans en
discuter avec ses collèges, c) sans en informer les developpeurs ayant à
travailler avec ce code, ...


En supposant que tu sois là et /ouque les personnes a qui tu en a
discuté transmettent.


tu prends les gens pour des anes ou tu nous livres là tes frustrations ?


Mes frustrations, certainement. C'est bien pour ça que j'essaye de ne
pas reproduire ce que j'ai eu a subir.


2. Un client ne devrait pas être étonné:
Tiens, il a mis une fonction reset() ?
Dans quel cas doit je l'utiliser plutôt que de re-instancier. Je vais
appeler la hot-line [...]


comme également celui d'imaginer que *nécessairement* toutes les
livraisons sont en code source [1], dans le monde du logiciel (et malgr é
tous les charmes du libre ET ouvert) la plupart des livraisons sont,
faut-il te le rappeler, en binaire (libs et / ou exec).

[1] j'écarte évidemment les fournitures comme celles que pourrais fai re
une SSII contractée pour fournir un source, car dans ce cas le
contractant aura évidemment fourni un cahier des charges complet - dans
le même temps je n'ai jamais vu pire code que justement ceux fourni dans
ce cadre, donc j'écarte doublement pour ne pas épiloguer sur ce cas.

3. Tu ne devrais pas être étonné:
Quel est l'imbécile qui a écrit ce code ? ... Oh !


l'écho n'étant sûrement pas là pour te répondre:
quel est l'imbécile qui a formulé cet avis ? ... Oh !
je suppose que ta formulation reflète ta conviction d'être génial e t son
corrolaire nécessaire que les autres sont des imbéciles.


Tu suppose mal. J'ai du mal m'exprimer. L'imbécile n'est en
l'occurrence que soit meme. Il arrive qu'un design qu'on trouve genial
a une epoque et dont on a oublier etre l'auteur revienne nous etonner
de cette maniere. J'ai pris la fonction reset() a titre d'exempe. Je
n'entendais pas parler de ton design en particulier mais rester dans
le contexte. Au vu de ta reaction, ce choix a été malheureux.



Michael


Avatar
Michael DOUBEZ
Michael DOUBEZ wrote on 06/07/2007 11:49:

je note ici que l'abstraction doit être une caractéristique forte
d'un flux.


En realité, les flux ne sont pas abstraits même du point de vue du
langage: il n'est pas possible d'hériter d'un flux.


je ne citais que James (sans chercher à contredire cette affirmation).

je n'introduisais pas un 'flux' comme nécessairement virtuel imposant un
schéma d'héritage (même si je l'utilise souvent ainsi) et évoquait
l'abstraction pour elle-même (sans héritage lié).

toutefois dans mon schéma polymorphe, je pensais plus à une abstraction
du code (des traitements) alors que vous (avec James) parlez plus
d'abstraction des données, vous refusant à associer la source des
sources des données (le "contenu") au flux, dont acte.


Entendu.


Comment effacer quelque chose qu'il n'y a pas, voilà la
question ?


ben ?! si il y a un contenu on l'efface [...]


Il s'agit donc bien d'effacer le contenu du streambuf sous-jacent en
supposant qu'il y en ait un.


comme dit ci-avant, pour moi il n'est pas si sous-jacent.


C'est vrai que en général, on défini un stream pour gérer le streambuf
et que donc le streambuf est affleurant. Mais, AMA ce n'est une question
de fournir un moyen simple d'exploiter le streambuf (je n'aimerais pas
avoir à gérer un i/ostream ET un fstreambuf à chaque fois que j'ouvre un
fichier par exemple).

Maintenant, si tu nommes quelque chose "stream"/flux, ce mot fait parti
du standard et donc prends une signification précise. C'est pourquoi
j'ai parlé d'étonnement dans un autre post (peut être pas judicieux mais
je suis ouvert aux remarques constructives).

Ensuite, je suis d'accord que le dogme n'a pas à prendre pas le dessus
sur la practicalité et qui si quelqu'un a besoin d'une fonction reset()
d'effacement de flux (par exemple) pourquoi pas ? Mais je m'interroge
sur ce qui le motive car dans ce cas, il y a selon moi plusieurs
possibilités sous jacentes:
1. Les membre du WG21 ont pas ou mal compris la notion (de flux) et
auraient du rajouter la fonction (reset()). Douteux sachant qu'ils se
sont basés sur 10 ans de pratique pour établir le standard.
2. Ils ont conçu qu'on puisse en avoir besoin pour la notion (de flux)
mais pas dans le cas général.
3. Il n'y en a pas a priori besoin mais c'est une fonction helper qui
permet de signifier et de réaliser une opération courant dans un domaine.
4. C'est un besoin très spécifique à un domaine. Dans ce cas peut être
ne s'agit il pas d'un flux au sens de la norme ou alors une
responsabilité qui a été sur-rajouté a la classe représentant un flux.
Dans ce dernier cas, peut être vaudrait il mieux sortir la méthode
(reset()) de la classe.



Michael




Avatar
Ael Rowan Terence
"James Kanze" a écrit dans le message de
news:
On Jul 6, 11:52 am, "Christophe Lephay"
wrote:

La règle donc, c'est d'abord d'écrire le code le plus
simplement et le plus clairement possible ; plus c'est simple,
et plus c'est clair, plus il serait facile d'effectuer n'importe
quelle modification qui s'avère nécessaire par la suite.



Entierement, d'accord.
Même, j'en suis arrivé à me dire en paraphrasant : "faire et refaire c'est
toujours travailler",
je suis convaincu que " ecrire et reecrire c'est ameliorer le soft".
Cela n'est pas partagé par tout le monde, et je n'entrerai pas dans une
polémique.



Je ne voulais pas critiquer Ael Rowen ; je ne sais pas dans
quel but il veut « effacer ».


Je cherchais un moyen d'effacer le contenu d'un ostringstream.
Ne trouvant pas, j'émis la demande sur le forum.

En parallele j'ai continué de chercher. Quand je suis arrivé à la solution
de reconstruire le flux.
J'ai, alors, annulé mon message. Mais trop tard, la réactivité du groupe m'a
pris de court.

Puis par acquit de conscience, j'ai voulu tester les deux solutions.
Mais à l'heure actuelle il n'y a pas de volonté de ma part de trancher pour
l'une ou pour l'autre. Il est encore trop tôt, j'ai besoin de beaucoup plus
de temps pour me faire une idée plus précise.

En tout cas, je tiens, sur l'aspect purement technique, à te renouveler mes
remerciements, pour la finesse de ton savoir.

<mode demi-sourire on>
Et pour le reste, ...heu.. heuheum..., je pencherai pour une inclination
"artiste", qui te permet de du donner du sens, là où les autres s'arrêtent.
<mode demi-sourire off>

3 4 5 6 7