Bonjour! La conférence d'aujourd'hui ne sera pas très longue, mais certainement utile :) Nous parlerons de ce qu'on appelle l' opérateur ternaire . « Ternaire » signifie « triple ». Il s'agit d'une alternative à l'opérateur conditionnel
if-else
que vous connaissez déjà. Donnons un exemple. Disons qu'une personne décide d'aller au cinéma pour voir un film classé 18+. Le gardien vérifie son âge à l'entrée : s'il atteint la limite d'âge, il l'autorise à entrer dans la salle ; sinon, il le renvoie chez lui. Créons une classe Man
et vérifions-la avecif-else
:
public class Man {
private int age;
public Man(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static void main(String[] args) {
Man man = new Man(22);
String securityAnswer;
if (man.getAge() >= 18) {
securityAnswer = "It's all right, come in!";
} else {
securityAnswer = "This movie is not suitable for your age!";
}
System.out.println(securityAnswer);
}
}
Sortie de la console :
"Все в порядке, проходите!"
Si nous supprimons la sortie vers la console, notre test ressemble à ceci :
if (man.getAge() >= 18) {
securityAnswer = "It's all right, come in!";
} else {
securityAnswer = "This movie is not suitable for your age!";
}
Ici, en fait, une logique simple fonctionne : une condition est vérifiée (âge >= 18). En fonction de cela, securityAnswer
l’une des deux lignes contenant la réponse du gardien est affectée à la variable. De telles situations, « une condition - deux résultats possibles », se produisent très souvent en programmation. Par conséquent, le même opérateur ternaire a été créé pour eux. Avec lui, nous pouvons simplifier notre vérification à une seule ligne de code :
public static void main(String[] args) {
Man man = new Man(22);
String securityAnswer = (man.getAge() >= 18) ? "It's all right, come in!" : "This movie is not suitable for your age!";
System.out.println(securityAnswer);
}
Voilà à quoi ressemble le travail de cet opérateur. On l'appelle ternaire (triple) car 3 composantes participent à son travail :
- Une condition (
man.getAge() >= 18
) - Deux issues possibles ( « C'est bon, passe à autre chose ! » et « Ce film n'est pas adapté à ton âge ! » )
man.getAge() >= 18 ?
« L’âge de la personne est-il supérieur ou égal à 18 ans ? Voici le premier résultat. Il se déclenche si la condition est renvoyée true
, c'est-à-dire si elle est vraie :
String securityAnswer = man.getAge() >= 18 ? "It's all right, come in!"
L'âge de la personne est-il supérieur ou égal à 18 ans ? Si oui, attribuez à la variable securityAnswer
la valeur « Tout va bien, entrez ! » . Ceci est suivi de l' :
opérateur « », après quoi le deuxième résultat est écrit. Il se déclenche si la condition renvoie false
, c'est-à-dire qu'elle est fausse :
String securityAnswer = man.getAge() >= 18 ? "It's all right, come in!" : "This movie is not suitable for your age!";
L'âge de la personne est-il supérieur ou égal à 18 ans ? Si oui, attribuez à la variable securityAnswer
la valeur « Tout va bien, entrez ! » . Sinon, attribuez à la variable securityAnswer
la valeur « Ce film ne convient pas à votre âge ! » Voilà à quoi ressemble la logique générale de l’opérateur ternaire. condition ? résultat 1 : résultat 2 D'ailleurs, il n'est pas nécessaire de mettre la condition entre parenthèses : nous l'avons fait pour une meilleure lisibilité. Cela fonctionnera sans eux :
public static void main(String[] args) {
Man man = new Man(22);
String securityAnswer = man.getAge() >= 18 ? "It's all right, come in!" : "This movie is not suitable for your age!";
System.out.println(securityAnswer);
}
Que devez-vous utiliser : if-else
, ou l'opérateur ternaire ? En termes de performances, il n'y a pas beaucoup de différence. Plus précisément, cela peut exister, mais c'est insignifiant. Ici la question porte plutôt sur la lisibilité de votre code. C’est extrêmement important en programmation : le code que vous écrivez doit non seulement fonctionner correctement, mais aussi être facile à lire. Après tout, il peut être « hérité » d'autres programmeurs, vos collègues ! Et si c'est difficile à comprendre, cela compliquera à la fois leur travail et le vôtre : ils courront vers vous pour des explications toutes les 5 minutes. Une recommandation générale pourrait ressembler à ceci : si la condition est simple et facile à vérifier, vous pouvez utiliser l’opérateur ternaire sans dommage. De cette façon, vous réduirez la quantité de code et le nombre de contrôles if-else
, qui sont peut-être déjà nombreux. Mais si la condition est complexe et en plusieurs étapes, il est préférable d'utiliser if-else
. Par exemple, dans ce cas, ce serait une mauvaise idée d’utiliser l’opérateur ternaire :
String securityAnswer = (man.getAge() >= 18 && (man.hasTicket() || man.hasCoupon()) && !man.hasChild()) ? "Come in!" : "You can not pass!";
Vous ne comprendrez donc pas immédiatement ce qui se passe ici ! Le code est devenu très difficile à lire. Et tout cela à cause d'une condition difficile :
- Si une personne a plus ou égal à 18 ans + possède un billet (ou un coupon pour une entrée gratuite) + n'a pas de jeunes enfants avec elle - alors elle peut passer.
- Si au moins une partie de la condition renvoie false, alors ce n’est pas possible.
if-else
. Oui, notre code serait plus grand, mais il serait bien plus lisible. Et aucun de vos collègues ne se serrera la tête s'il hérite d'un tel code :) Enfin, je peux vous recommander le livre. Dans la conférence, nous avons abordé le sujet de la lisibilité du code. Le livre classique « Clean Code » de Robert Martin lui est dédié. Il contient les meilleures pratiques et recommandations pour les programmeurs qui vous permettront d'écrire du code non seulement fonctionnel, mais également facile à lire. Il y a une critique de ce livre sur JavaRush.
GO TO FULL VERSION