OVH Cloud OVH Cloud

Opérateur ternaire, indenter ?

33 réponses
Avatar
Pierre Maurette
Bonjour,

J'infidélise actuellement pas mal du coté de Php et Java. Je me rends
compte à cette occasion de l'intérêt de l'opérateur ternaire, qui est
peut-être mal vendu en C.
On peut le trouver peu lisible, mais il suffit de s'y mettre et
l'investissement est rentable, vu qu'il a la même syntaxe et le même
comportement en C, C++, Php, Java et quelques autres "C inspired" sans
doute.

Ce que j'apprécie, c'est qu'il s'agit d'un *opérateur*, avec les
possibilités qu'offre l'évaluation économique garantie.

C'est sur le style que j'aimeerais avoir des avis. J'ai lu ici que
certain guru préférait développer en plusieurs lignes.
A partir de cette expression:

running_ = status == 0 ? false : status == 1 ? true : !running_;

je peux faire:

running_ = (status == 0) ? false : (status == 1) ? true : !running_;
(parenthésage sytématique des conditions)

ou (ma préférée peut-être)
running_ = (status == 0 ? false : (status == 1 ? true : !running_));
(parenthésage sytématique de l'opérateur ternaire)

ou les deux:
running_ = ((status == 0) ? false : ((status == 1) ? true :
!running_));

Sur plusieurs lignes, par exemple:
running_ = status == 0 ?
false
:
status == 1 ?
true
:
!running_
;

Je n'aime pas trop la présentation sur plusieurs lignes, au motif
qu'elle masque l'aspect opérateur et donne l'idée d'une instruction de
contrôle de flux.

Des avis ? Merci d'avance ....

--
Pierre Maurette

10 réponses

1 2 3 4
Avatar
Harpo
Harpo wrote:

Pourquoi pas aussi :

running_ = status == 0 // j'aurais mis des parenthèses inutiles
? false
: status == 1
? true
: !running_;


Je pense que lasolution suivante est plus acceptable car elle donne plus
de concision ce qui est le seul intérêt de l'operateur ternaire.

running_ = status == 0
? false
: status == 1 ? true : !running_;

voire même :

running_ = status == 0 ? false
: status == 1 ? true : !running_;

ou encore, pour pouvoir systématiser pour un niveau d'imbrication n :

running_ = status == 0 ? false
: status == 1 ? true
: !running_;

Mais il me semble que le dernier niveau d'imbrication devrait tenir sur
une ligne (s'il reste de la place) et donc la solution précédente me
semble la meilleure.

--
http://patrick.davalan.free.fr/

Avatar
Emmanuel Delahaye
Copié/collé de Google Groups:
<cit>
A trop forcer le trait, on se décrédibilise...

running_ = status == 0
? false
: status == 1
? true
: !running_;
</cit>

Copié/collé de MesNews:
<cit>
A trop forcer le trait, on se décrédibilise...

running_ = status == 0
? false
: status == 1
? true
: !running_;
</cit>

Je ne vois aucune différence, tout est bien indenté comme il faut.


Décidément, je n'arrive pas à comprendre ce que tu n'aimes pas dans mon
code.

--
A+

Emmanuel Delahaye

Avatar
Stephane Legras-Decussy
"Simias" a écrit dans le message de news:
445dfba5$0$23118$
euh... on perd pas tout l'interet du ternaire la? je veux dire, c'est
utilise pour la conscision en general.


c'est quoi l'interet de la concision ?

J'ajouterais egalement qu'un autre interet du ternaire c'est de pouvoir le
mettre dans un appel de fonction:


tu pars à la retraite, on doit jeter ton code...

Avatar
Simias
Stephane Legras-Decussy wrote:
"Simias" a écrit dans le message de news:
445dfba5$0$23118$
euh... on perd pas tout l'interet du ternaire la? je veux dire, c'est
utilise pour la conscision en general.


c'est quoi l'interet de la concision ?



Cela peut parfois contribuer a rendre du code plus lisible en ne
l'alourdissant pas avec des 'if', meme si on cours le risque d'obtenir
l'effet inverse a en abuser.

J'ajouterais egalement qu'un autre interet du ternaire c'est de pouvoir le
mettre dans un appel de fonction:


tu pars à la retraite, on doit jeter ton code...



Pourquoi cela? Suis-je si mauvais codeur?



--
Simias


Avatar
Jean-Claude Arbaut
Simias wrote:
Stephane Legras-Decussy wrote:

"Simias" a écrit dans le message de news:
445dfba5$0$23118$

euh... on perd pas tout l'interet du ternaire la? je veux dire, c'est
utilise pour la conscision en general.



c'est quoi l'interet de la concision ?



Tu as entendu parler d'Ada ;-)



Avatar
Harpo
Stephane Legras-Decussy wrote:


"Simias" a écrit dans le message de news:
445dfba5$0$23118$
euh... on perd pas tout l'interet du ternaire la? je veux dire, c'est
utilise pour la conscision en general.


c'est quoi l'interet de la concision ?


Je pense que quelque chose de simple doit s'écrire simplement sans
prendre beaucoup de lignes, cela évite de browser des pages d'une
fonction avant de se rende compte qu'elle ne fait pas grand chose.

J'ajouterais egalement qu'un autre interet du ternaire c'est de
pouvoir le mettre dans un appel de fonction:


tu pars à la retraite, on doit jeter ton code...


On peut mettre une expression à n'importe quel endroit où c'est autorisé
par la syntaxe du langage, le ternaire n'y échappe pas, il faut sans
doute éviter trop de niveaux d'imbrication mais cela peut éviter des
étapes et variables intermédiaires qui n'apportent pas toujours grand
chose à la compréhension, C'est aussi une question d'appréciation de la
difficulté de relire un code.

Il n'est pas non plus interdit d'écrire en Cobol, le code sera peut-être
dans le meilleur des cas jeté avant la retraite.

--
http://patrick.davalan.free.fr/


Avatar
Pierre Maurette
Harpo wrote:

Pourquoi pas aussi :

running_ = status == 0 // j'aurais mis des parenthèses inutiles
? false
: status == 1
? true
: !running_;


Je pense que lasolution suivante est plus acceptable car elle donne plus
de concision ce qui est le seul intérêt de l'operateur ternaire.

running_ = status == 0
? false
: status == 1 ? true : !running_;

voire même :

running_ = status == 0 ? false
: status == 1 ? true : !running_;

ou encore, pour pouvoir systématiser pour un niveau d'imbrication n :

running_ = status == 0 ? false
: status == 1 ? true
: !running_;

Mais il me semble que le dernier niveau d'imbrication devrait tenir sur
une ligne (s'il reste de la place) et donc la solution précédente me
semble la meilleure.


Personnellement, je ne trouve aucun sens à indenter par rapport au
début de la ligne qui peut justement être n'importe quoi. Ma logique
voudrait qu'on le fasse (éventuellement à 0, alignement) par rapport au
début de la condition ou au signe ?, l'important étant que les deux
résultats soient alignés.
Mais je préfère ne pas indenter et conserver tout le caractère
opérateur.
Comme pour le

if {}
else if {}
else if {}
else {}

qui s'écrit mécaniquement mais n'est pas "évident" au début, on peut
généraliser :

cond1 ? a : cond2 ? b : ..... : condn ? x : y ;

ou alors :

cond1 ? a :
cond2 ? b :
..... :
condn ? x :
y ;

?




--
Pierre Maurette


Avatar
Pierre Maurette
Copié/collé de Google Groups:
<cit>
A trop forcer le trait, on se décrédibilise...

running_ = status == 0
? false
: status == 1
? true
: !running_;
</cit>

Copié/collé de MesNews:
<cit>
A trop forcer le trait, on se décrédibilise...

running_ = status == 0
? false
: status == 1
? true
: !running_;
</cit>

Je ne vois aucune différence, tout est bien indenté comme il faut.



Il n'y a aucune différence entre les deux copies ci-dessus,
puisqu'elles sont conformes et du même texte. Le but était juste de
montrer que les espaces navaient pas "sauté chez moi" comme sugéré.

Décidément, je n'arrive pas à comprendre ce que tu n'aimes pas dans mon code.


Tant qu'à indenter, j'aime plutôt.
Mais néanmoins il y a une erreur, une typo sans doute. Quelle règle
cohérente peut amener à aligner le premier ? sous le 'a' de "status" et
le second sous le 's' de "status" ? Il n'y a pas de style unique, mais
je n'en vois aucun qui arrive à ce résultat.

--
Pierre Maurette


Avatar
Emmanuel Delahaye
Mais néanmoins il y a une erreur, une typo sans doute. Quelle règle
cohérente peut amener à aligner le premier ? sous le 'a' de "status" et
le second sous le 's' de "status" ? Il n'y a pas de style unique, mais
je n'en vois aucun qui arrive à ce résultat.


Eh bé, Tout ça en arriver là ? Tu ne pouvais pas le dire tout de suite ?
Sache que je n'ai plus 20 ans et ma vue baisse (ce qui me console, c'est
que ça t'arrivera aussi hé hé). J'ai fait la mise en page à la main vite
fait en mettant (croyant mettre) une tabulation de 3 espaces... Pas
besoins de jouer aux devinettes pour si peu...

Prend une femme, fait des enfants, ça t'occupera...

--
A+

Emmanuel Delahaye

Avatar
Stephane Legras-Decussy
"Harpo" a écrit dans le message de news:
445e3a2a$0$20175$
Je pense que quelque chose de simple doit s'écrire simplement sans
prendre beaucoup de lignes, cela évite de browser des pages d'une
fonction avant de se rende compte qu'elle ne fait pas grand chose.


oui mais là en l'espèce, c'est quelque chose de
simple qui s'écrit compliqué en peu de ligne.

je préfère largement scroller 2 pages qu'un gamin de 12 ans
comprend que de jouer au Sudoku sur 3 lignes qui tuent...

dès qu'un projet devient gros, de toute facon, ça devient
globalement complexe à comprendre avec des montagnes
de fichiers donc il faut compenser
en étant toujours localement trivial amha.

1 2 3 4