Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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
Pierre Maurette wrote:


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.


Je n'aime pas non plus, l'intérêt de l'opérateur ternaire est qu'il
apporte de la concision, en 1 ligne et en 1 coup d'oeil tu vois ce que
cela fait.

Se forcer à mettre ça sur plusieurs lignes, c'est lui enlever son
intérêt. James Kanze est plutôt du genre à le mettre, même sans
imbrication, sur plusieurs lignes suivant un de ses posts récent, je
trouve que, exceptionnelement de sa part, ce n'est pas un bon avis.
L'intérêt est pour moi la concision, c'est tout, je ne pense pas que les
imbriquer apporte àdela concison de manière suffisante, sauf si c'est
simple et tient en 1 ligne, sinon il vaut mieux mettre des if/else,
c'est plus simple.
Après pour moi ça devient compliqué et je pense à ceux qui sont comme
moi.
Pour récapituler, lorsqu'on a besoin de plusieurs lignes, c'est une
utilisation dévoyée.

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

Avatar
Emmanuel Delahaye
<présentation opérateurs ternaires>

1 ligne, pas de problèmes si il n'y en a qu'un... Par contre, si il y en
a plusieurs :

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


A trop forcer le trait, on se décrédibilise...

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

--
A+

Emmanuel Delahaye

Avatar
Pierre Maurette
<présentation opérateurs ternaires>

1 ligne, pas de problèmes si il n'y en a qu'un... Par contre, si il y en a
plusieurs :

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


A trop forcer le trait, on se décrédibilise...


C'est ce que j'appelle le syndrome de l'écologiste. Surargamentation
systématique, vouloir absolument que toutes les croix soient du même
coté.

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


Il n'y a pas un petit souci dans ton indentation ?

--
Pierre Maurette


Avatar
Emmanuel Delahaye
running_ = status == 0
? false
: status == 1
? true
: !running_;


Il n'y a pas un petit souci dans ton indentation ?


C'est possible, mais je ne vois rien. Au lieu de jouer aux devinettes,
donne ta version...

--
A+

Emmanuel Delahaye


Avatar
Pierre Maurette
running_ = status == 0
? false
: status == 1
? true
: !running_;


Il n'y a pas un petit souci dans ton indentation ?


C'est possible, mais je ne vois rien. Au lieu de jouer aux devinettes, donne
ta version...


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

--
Pierre Maurette



Avatar
Simias
Pierre Maurette wrote:
running_ = status == 0
? false
: status == 1
? true
: !running_;


Il n'y a pas un petit souci dans ton indentation ?


C'est possible, mais je ne vois rien. Au lieu de jouer aux devinettes,
donne ta version...


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



euh... on perd pas tout l'interet du ternaire la? je veux dire, c'est
utilise pour la conscision en general. La non seulement le gain par
rapport au 'classique' if est minime, mais c'est pas des plus lisible a
mon gout.

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

void foo(int);

// ...

int i;

//...

foo((i < 10) ? i : (i -10));

--
Simias




Avatar
Emmanuel Delahaye
donne ta version...


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



Désolé, je ne vois pas la différence. Peut être que tu reçois :

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

mais moi, j'ai envoyé (_ = espace)

running_ = status == 0
____________? false
_______________: status == 1
__________________? true
__________________: !running_;

Si les espaces ont sauté chez toi, je n'y peux rien (je vois les tiens)

Configuration : Windows XP/ThunderBird 1.5.0.2 en mode texte police non
proportionnelle (courrier)

--
A+

Emmanuel Delahaye


Avatar
Pierre Maurette
Pierre Maurette wrote:
running_ = status == 0
? false
: status == 1
? true
: !running_;


Il n'y a pas un petit souci dans ton indentation ?


C'est possible, mais je ne vois rien. Au lieu de jouer aux devinettes,
donne ta version...


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



euh... on perd pas tout l'interet du ternaire la? je veux dire, c'est utilise
pour la conscision en general. La non seulement le gain par rapport au
'classique' if est minime, mais c'est pas des plus lisible a mon gout.

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

void foo(int);

// ...

int i;

//...

foo((i < 10) ? i : (i -10));


C'est mon avis. Eventuellement, relisez le fil ...

--
Pierre Maurette





Avatar
Pierre Maurette
donne ta version...


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



Désolé, je ne vois pas la différence. Peut être que tu reçois :

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

mais moi, j'ai envoyé (_ = espace)

running_ = status == 0
____________? false
_______________: status == 1
__________________? true
__________________: !running_;

Si les espaces ont sauté chez toi, je n'y peux rien (je vois les tiens)

Configuration : Windows XP/ThunderBird 1.5.0.2 en mode texte police non
proportionnelle (courrier)


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>


--
Pierre Maurette



Avatar
Harpo
Pierre Maurette wrote:

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


Il n'y a pas un petit souci dans ton indentation ?


C'est possible, mais je ne vois rien. Au lieu de jouer aux
devinettes, donne ta version...


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



Nous sommes tombé sur un problème d'importance...
Pourquoi pas aussi :

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

Sinon l'indentation dépend de la longueur d'un identifieur, si on change
running_ par r, dans vos versions l'indentation devrait être changée
pour pas que cela fasse un peu décalé.

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




1 2 3 4