Parfois, les conditions peuvent s’avérer un peu longues à écrire, un peu trop indigestes… et on aimerait bien pouvoir les remplacer par quelque chose de plus court. C’est justement là tout l’intérêt des expressions ternaires (ou plus simplement ternaires) : raccourcir l’écriture de certains morceaux de code, et peut-être même un peu trop pour certains, mais nous en reparlerons un peu plus bas.
Dans quels cas ?
Les expressions ternaires peuvent remplacer des conditions, mais pas n’importe lesquelles bien évidemment. Commençons par poser le contexte : nous avons une variable et nous voulons lui affecter une valeur. Jusque-là, rien de bien exceptionnel, mais ça se corse un peu quand on précise que cette valeur change en fonction d’une certaine condition. Par exemple, imaginons une variable contenant une chaîne de caractères valant soit « positif » si un nombre est supérieur ou égal à 0, soit « négatif » si ce nombre est strictement inférieur à 0.
Bon, techniquement, nous n’avons rien de bien compliqué et nous pouvons programmer facilement notre exemple, ici en pseudo-code pour plus d’universalité :
si (nombre >= 0)
signe = "positif";
sinon
signe = "négatif";
Soit quatre lignes pour une si petite chose, et encore, on n’a pas utilisé d’accolades !
Les expressions ternaires
Une expression ternaire, comme son nom l’indique, est composée de trois éléments : une condition, une première valeur qui sera prise si la condition est respectée et une seconde valeur qui sera prise sinon. Concrètement, il vous suffit donc d’écrire ceci :
variable = (condition) ? valeur_si_vrai : valeur_si_faux;
Ce qui donne quelque chose de simple avec notre exemple :
signe = (nombre >= 0) ? "positif" : "négatif";
Comme vous le voyez, c’est plutôt simple, l’écriture est raccourcie, bref, tout est beau. Et là où c’est encore plus beau, c’est que vous n’êtes pas forcément obligé de passer par une variable. Imaginons que le code vu ci-dessus soit en fait extrait d’une fonction, vous pourriez être tenté d’écrire ça :
fonction signe(nombre) {
s = (nombre >= 0) ? "positif" : "négatif";
return s;
}
Mais vous pouvez directement, si vous le souhaitez, passer votre expression ternaire au return :
fonction signe(nombre) {
return (nombre >= 0) ? "positif" : "négatif";
}
Les questions existentielles de la clarté
Les ternaires ne font pas l’unanimité et si elles permettent de raccourcir l’écriture, certains reprochent à ce type d’expression le fait de ne pas être très clair. Personnellement, je les trouve suffisamment claire… tant qu’on ne pond pas des lignes de 10 mètres de long en imbriquant des douzaines d’expressions ternaires. À vous de vous faire votre propre opinion, mais sachez que comme beaucoup de choses, les ternaires ont leurs détracteurs.
5 commentaires
Certes le post porte sur les expressions ternaires mais 0 est le seul nombre à la fois positif et négatif.
Pourquoi ne pas baser ton exemple sur la parité d’un nombre ?
@YopSolo: Tout dépend de l’utilisation qu’on en fait, le plus souvent on considère plutôt l’aspect positif de zéro, d’où mon choix. Après, ce n’est qu’un exemple…
Non, il n’y a pas de notion de ‘plus souvent’ en algo.
@YopSolo: Quand on cherche à optimiser et qu’on essaie de pas pondre des trucs dégueulasses inutilement lourds, si, il y a cette notion. Ici, ça ne servait strictement à rien d’indiquer que le nombre pouvait être nul étant donné qu’on ne cherche que le signe.
Après cette petite passe d’armes d’il y a … 7 ans, je remercie Jérémy pour son explication claire d’une forme plutôt rare mais élégante de la condition ternaire.
… et on se fout que le code proposé ne soit pas directement compilable, du moment qu’il est pédagogique et qu’il a atteint son but.