L’opérateur ternaire

L’opérateur ternaire est un raccourci qui permet de tester une condition et de choisir entre deux valeurs possibles. Il fonctionne comme un if compressé en une seule ligne, en renvoyant une première valeur si l’expression est vraie, et une seconde si elle est fausse. Cet opérateur rend le code plus concis et évite les blocs conditionnels trop verbeux.
Les origines de l’opérateur ternaire
L’opérateur ternaire trouve son origine dans le langage C, développé au début des années 1970 par Dennis Ritchie aux Bell Labs. Dans un contexte où chaque caractère de code comptait et où les développeurs travaillaient encore très près du matériel, il fallait des solutions concises et efficaces pour exprimer des conditions simples. Le ternaire fut introduit comme un raccourci syntaxique à l’instruction if…else
, permettant de choisir entre deux valeurs directement dans une expression unique. La syntaxe condition ? valeur_si_vrai : valeur_si_faux
s’imposa alors comme une innovation élégante et pratique.
Adopté dès les premières normes du C, l’opérateur ternaire est rapidement devenu un standard incontournable dans les langages dérivés comme C++, Java, JavaScript ou PHP, chacun reprenant cette notation presque à l’identique. Même les langages qui n’ont pas gardé exactement le même symbole ont intégré le concept : en Python, on le retrouve sous la forme x if condition else y
, et en Swift, sous une écriture quasi identique à celle du C. Ce succès s’explique par un équilibre subtil entre concision et lisibilité : il permet de condenser une logique conditionnelle tout en restant clair pour un lecteur habitué.
Sur le plan théorique, l’opérateur ternaire s’inscrit dans une longue tradition de logique booléenne et de mathématiques discrètes. Il formalise le principe du choix conditionnel entre deux branches possibles, une idée qui existe déjà dans les fondements de l’algèbre de Boole. Dans ce sens, le ternaire peut être vu comme une traduction directe de la notion “si condition alors valeur A, sinon valeur B” en une expression compacte.
Quand l'équipe Blogger a upgradé son propre langage d’expressions en 2015, il était presque évident que cet opérateur ferait partie de l’arsenal disponible. Déjà familier à la majorité des développeurs, il s’est intégré sans effort à la logique du moteur d’expressions : il fonctionne avec tous les types de données (chaînes, nombres, booléens, tableaux) et conserve le rôle qui l’a rendu célèbre — simplifier et condenser des tests conditionnels.
En résumé, l’opérateur ternaire est une petite invention issue des débuts de la programmation système qui a traversé les décennies sans perdre son utilité. Né pour répondre à des contraintes techniques fortes, il est aujourd’hui un pilier syntaxique universel, présent aussi bien dans les langages généralistes que dans un DSL spécialisé comme celui de Blogger.
Les syntaxes d’écriture
L’opérateur ternaire ne dispose que d’une syntaxe infixe, identique à celle que l’on retrouve dans la plupart des langages de programmation. Il s’utilise toujours avec trois opérandes : une condition booléenne, une valeur si la condition est vraie et une valeur si elle est fausse. Selon le résultat du test, l’une ou l’autre des deux valeurs est renvoyée.
Noms | Opérateurs | Syntaxes | Opérandes | Résultat |
---|---|---|---|---|
Sélecteur Ternaire |
? : |
Syntaxe Infixe boolean ? value1 : value2 |
3 | value1 si la condition est vraie, sinon value2 |
Utilisations et règles
L’opérateur ternaire manipule toujours trois opérandes : une condition booléenne, une valeur renvoyée si la condition est vraie, et une valeur renvoyée si la condition est fausse.
-
La condition booléenne peut être définie de plusieurs façons :
Une valeur explicite comme
true
oufalse
,Une donnée ou variable (par ex.
data:view.isHomepage
),Ou le résultat d’une autre expression booléenne (par ex.
data:posts.length gt 0
).
-
Les deux autres valeurs (résultat si vrai et résultat si faux) peuvent être de tout type :
Une chaîne de caractères,
Un nombre,
Un booléen,
Une donnée ou variable,
Ou encore le résultat d’une expression imbriquée (arithmétique, concaténation, coalescence, etc.).
Le résultat du ternaire peut être utilisé comme opérande dans une autre opération, à condition que son type corresponde à ce que l’opération parente attend. Exemple : si le ternaire renvoie un nombre, on peut l’inclure dans un calcul arithmétique ; s’il renvoie une chaîne, on peut l’insérer dans une concaténation ou dans un attribut HTML.
Le ternaire est conçu pour rendre le code plus concis et éviter d’écrire un bloc
<b:if>
complet. C’est un véritable if compressé qui tient en une seule expression.-
Toutefois, l’opérateur devient difficile à lire si on multiplie les imbriquations. Des ternaires emboîtés peuvent vite rendre le code obscur et source d’erreurs. Dans ce cas, il vaut mieux :
Quelques exemples
Sélection de chaînes de caractères
<b:with value='data:blog.isPrivate ? "privé" : "public"' var='status'> <b:eval expr='"Ce blog est " + data:status'/> </b:with>
Ici, le ternaire transforme une condition booléenne en un texte lisible. Si le blog est privé (true
), la variable prend la valeur privé
; sinon, elle vaut public
. Cette valeur est ensuite réutilisée dans une concaténation pour produire la phrase complète. C’est un cas typique où le ternaire remplace avantageusement un <b:if>
encombrant.
Sélection de nombres
<b:with value='data:blog.isPrivate ? 10 : 5' var='myNumber'> <b:eval expr='data:myNumber'/> </b:with>
Le ternaire peut aussi renvoyer des nombres. Dans cet exemple, si le blog est privé, la variable vaut 10
; sinon, elle vaut 5
. Le résultat peut ensuite être utilisé tel quel ou servir dans un calcul arithmétique. Cela montre que le ternaire n’est pas limité aux chaînes de caractères.
Sélection de tableaux
<b:loop values='data:view.isHomepage ? data:posts limit 5 : data:posts' var='post'> </b:loop>
Le ternaire s’applique aussi aux collections. Ici, si la condition est vraie (la page courante est l’accueil), le tableau de posts est limité à cinq éléments. Sinon, c’est le tableau complet qui est parcouru. On voit que le ternaire permet d’adapter le contenu affiché sans écrire plusieurs boucles distinctes.
Dans une inclusion commune
<b:loop values='data:widget.type == "PageList" ? data:links : data:posts' var='item'> <a expr:href='data:item.href ?: data:item.url'> <b:eval expr='data:item.title'/> </a> </b:loop>
Ce dernier exemple combine le ternaire et la coalescence dans une inclusion commune. Selon le type du widget, on choisit de parcourir data:links
(PageList) ou data:posts
(Blog). À l’intérieur de la boucle, la coalescence règle les différences de schéma : href
ou url
pour le lien, et title
pour l’intitulé. Résultat : un seul bloc de code suffit à gérer deux gadgets aux structures proches mais pas identiques.