Je me demandais s'il y avait un équivalent du bloc 'with' en C++, présent dans la plupart des langages objets tels que VB ou Java. Je n'ai rien trouvé à ce sujet, mais ça améliorerait bien la lisibilité du programme

Merci d'avance

Type& o = mon_objet_complique.avec_un_acces_a_un_champ; o.fonction(); o += 2;
GoldenCrystal :
Non, ça n'existe pas et c'est bien mieux comme ça. (D'autant plus que ça ne sert vraiment a rien)
With MaVariableAvecUnNomLongPourQueToutLeMondeCompreneCeQueCest .Membre = 3 With .MembreAvecUnNomPasForcementCourt .Membre = .Membre + 1 ' Et là tu appelles comment le .Membre du précédent ?? (< - syntaxe foireuse) ' Un tas d'autres trucs End With .Membre2 = .Membre1 + 2 'Si jamais le début du bloc est plus visible t'es dans la merde pour savoir ce que ça veut dire... ' Etc... End With
with user id = 1337; name = 'toto'; pass = 'plop'; age = 27; end
Zephyr :
chacun son truc hein, perso je trouve quewith user id = 1337; name = 'toto'; pass = 'plop'; age = 27; end
conflit de champs (ça arrive quand même pas souvent hein, faut pas être de mauvaise foi non plus)
Pollux
: Si tu as un éditeur qui permet l'édition en colonne, en 1 seconde chrono tu aurais pu rajouter "user." au début de chaque ligne...
Le problème n'est pas "est-ce que ça arrive souvent", le problème c'est "est-ce que ça peut arriver sans qu'on s'en rende compte", et là la réponse est oui... Et surtout ça peut casser sans prévenir même si le code fonctionnait parfaitement avant, par exemple si FooBarLib 1.1 rajoute un membre "size" à sa classe de marmottes en tutu, la variable locale "size" de ta fonction deviendra magiquement la "size" de la marmotte en tutu, bref c'est vraiment la fête du slip ^^
Zephyr
: Même sans ça, un copier coller c'est pas particulièrement long non plus, je parlais du code plus léger *une fois écrit*, rien à battre que ça prenne 1 seconde de plus ou de moins à taper ^^
user.id = 1337; user.name = 'toto'; user.pass = 'plop'; user.age = 27;
Le problème n'est pas "est-ce que ça arrive souvent", le problème c'est "est-ce que ça peut arriver sans qu'on s'en rende compte", et là la réponse est oui... Et surtout ça peut casser sans prévenir même si le code fonctionnait parfaitement avant, par exemple si FooBarLib 1.1 rajoute un membre "size" à sa classe de marmottes en tutu, la variable locale "size" de ta fonction deviendra magiquement la "size" de la marmotte en tutu, bref c'est vraiment la fête du slip ^^
Là aussi on ne parle pas de la même chose, perso quand j'utilise ça déjà c'est pour remplacer un petit bloc de code (du même genre que mon exemple du post précedent), souvent des initialisations ou ce genre de choses, avec des structures qui sont à moi... Sachant que le champ le plus local a la priorité, bien sûr que je ne vais pas m'amuser à faire un "with" sur une structure que je ne connais pas... mais ça s'appelle du bon sens. J'ai rarement tendance à chercher volontairement les bugs quand je code, et franchement les règles à respecter ici ne me semblent pas des plus difficiles à suivre ^^
Pollux :
Si tu parles de lisibilité, c'est pas un problème non plus :user.id = 1337; user.name = 'toto'; user.pass = 'plop'; user.age = 27;
c'est parfaitement lisible aussi, parce que les "user." sont bien en colonne
Oui, ton exemple est correct, mais il faut bien voir que ça t'empêche d'utiliser des variables externes dans tes initialisations (il faut te contenter de constantes ou de membres de la classe), sinon tu as des chances de tomber sur le piège dont je parleBref, avec ces règles ça a un usage *très* restreint, et même quand c'est utilisable c'est facilement remplaçable avec un truc moins piégeux et plus flexible... (plus flexible au sens où tu peux remplacer les constantes par des variables sans risque d'erreur)
Disons que c'est un peu comme le goto, dans un langage qui le propose, ce n'est pas grave de l'utiliser dans le cadre très restreint dont tu parles, mais ce n'est pas non plus une feature utile au point d'être un réel avantage pour le langage. Et, comme pour le goto, il y a des raisons de propreté qui font que ce n'est pas stupide pour un concepteur de langage ou un programmeur de dire "je ne veux pas utiliser/permettre ça parce que même si dans certains cas ça fait quelque chose de raisonnable et un chouilla plus concis, dans bcp d'autres cas ça a un impact négatif sur la lisibilité/maintenabilité" ^^
Zephyr :
Quel problème au fait que ce soit restreint ? C'est ça que j'arrive pas à comprendre... y'a des cas où c'est utilisable sans aucun risque, c'est dans ceux là que j'ai tendance à utiliser cette syntaxe, et partout où effectivement ça peut poser un problème, tant pis, j'utilise l'autre écriture que je trouve lourde. Ça me semblerait totalement stupide de m'interdire quelque chose que je trouve plus joli pour la simple raison qu'il existe des cas où on ne peut pas l'utiliser (rien qu'en écrivant la phrase ça me semble completement crétin comme raisonnement en tout cas, j'espere au moins avoir réussi à transmettre l'idée)
size = 2 with object .propriete = 1 .size = size endwith
with tonObjet.tonAutreObjet.unNomBienLongEtImpossibleATaperSurtoutUnLundiMatin .parent.size = 1 endwith
o = createobject('custom') p = createobject('custom') o.AddProperty('test') with o .test = 1 -> ok with p .test = 2 -> error: property 'test' not found endwith endwith
BrunniN'importe quoi...
: Si on suit ton principe, le 'switch' est inutile, mieux vaut utiliser les if / else if. Les 'for' sont aussi inutiles, autant faire un 'while'. En fait même les 'while' sont inutiles, on peut le faire avec des if/goto.
swhith (i) // int i { case 1: j += 1; break; case 2: j = 1; goto case 1; case 3: return j; }
Zephyr :
Encore une fois tu raisonnes dans un cas completement géneral, et donc pour moi completement hs. Prenons simplement ça : "tu ne peux pas transformer trivialement un with(user){bidule} en user.bidule". Je l'ai utilisé, donc si, sinon je ne l'aurais pas fait... Mais je commence à avoir légerement l'impression de me répeter, là. Donc non, ce n'est pas "1000 fois mieux", peut être seulement 5%, mais 5% sans *aucun* point négatif dans *le* cas dont je suis en train de parler, et uniquement celui-ci.
La perte de géneralité... si c'est pour expliquer que tout sucre syntaxique (puisque le "with" n'est rien d'autre que ça) ne permet pas forcément d'obtenir exactement la même chose que son équivalent développé, oui effectivement et ça n'a pas grand chose d'une révelation, mais personne n'a (à ma connaissance) pour l'instant été assez stupide pour dire non à ça dans un langage digne de ce nom : c'est même précisément l'inverse.
Brunni :
Les cas que tu cites sont réglés en VB ou en FoxPro par exemple:size = 2 with object .propriete = 1 .size = size endwithDonc même si dans certains cas ça peut induire en erreur comme pour size si on oublie le '.' (mais faut le faire quand même), ça reste beaucoup plus lisible à mon avis.
Bref, si le 'with' est bien pensé, je pense qu'il n'y a vraiment aucun souci à ce niveau là.
Si on suit ton principe, le 'switch' est inutile, mieux vaut utiliser les if / else if.
Les 'for' sont aussi inutiles, autant faire un 'while'.
En fait même les 'while' sont inutiles, on peut le faire avec des if/goto.
JackosKing-VNR :
> c'est pas bien niveau conception objet (foutrut de merde en perspective bonjour)
Pollux
: Ben si, le fait que le jour où tu veux remplacer user.age par un calcul qui dépend de la date, tu devras tout convertir, c'est bien un point négatif... Evidemment, il y a des cas où tu écris du code juste pour une fois et ensuite tu le balances à la poubelle, dans ce cas-là c'est pas grave, mais je ne parle pas de ça ^^ (et je suppose que toi non plus)
Pollux :
Ben je suis désolé si tu penses ça, mais tout sucre syntaxique n'est pas bon à prendre. Et inversement, il y a plein de sucres syntaxiques qui ne tombent pas dans l'écueil du with, dans la mesure où il ne perdent pas de généralité : int i=0; while (i<42) { ...; i++; } -> for (int i=0;i<42;i++) ...;, ou bien replaceword($my_word,$value+1) -> s/\b$my_word\b/$value+1/e.