Contrôle de flux de données
Objectifs de formation
Une fois cette unité terminée, vous pourrez :
- Présenter les différentes utilisations des opérateurs de comparaison
- Décrire la différence entre les instructions switch et if-else
Dans nos vies quotidiennes, nous devons constamment prendre des décisions. Nous faisons ainsi face à des interrogations telles que « Comment dois-je m’habiller ? », « Qu’est-ce que je vais manger ? » ou encore « Faut-il que j’aille à gauche ou à droite ? ». Il en va de même lors de l’écriture de code. Repensez au pseudo-code Teatime que nous avons étudié dans l’unité 1, plus précisément à l’étape 2.
Boil water in a Tea Kettle Fill Kettle with Water Switch Kettle On Wait for Water to Boil
Hmm… tout y semble relativement précis, n’est-ce pas ? Pour faire bouillir de l’eau, il faut remplir d’eau la bouilloire, l’allumer et attendre que l’eau bouille. Mais que faire s’il y a déjà de l’eau dans la bouilloire ? Comment procéder si la bouilloire est pleine ? Combien de temps l’eau doit-elle bouillir ?
Expressions et opérateurs d’expression
Avant de prendre des décisions, nous faisons souvent des comparaisons. Ainsi, on peut se demander « Ceci est-il plus grand que cela ? », ou encore « Ce choix est-il équivalent à cette autre possibilité ? ». Lorsqu’ils élaborent leurs applications, les développeurs comparent souvent des valeurs avant de prendre des décisions. En code, on compare deux expressions en plaçant un opérateur d’expression entre elles.
Une expression est un extrait de code qui, une fois évalué, renvoie une valeur unique. Pour les besoins de ce module, nous considérerons qu’une expression peut être une valeur littérale (telle que 12), une variable (telle que numberOfTeaCups) ou une opération mathématique (telle que 7 x 4).
Les opérateurs d’expression comparent deux valeurs ou montrent l’égalité entre celles-ci. Par exemple, une instruction de comparaison se compose de deux expressions séparées par un opérateur d’expression et produit une valeur booléenne, true ou false.
Opérateurs de comparaison
Opérateur | Description | Syntaxe | Résultat |
---|---|---|---|
< |
Inférieur à |
1 < 2 |
TRUE |
<= |
Inférieur ou égal à |
1 <= 2 3 <= 3 |
TRUE |
== |
Égal à |
10 == 10 |
TRUE |
!= <> |
Différent de |
10 != 0 10 <> 11 |
TRUE |
> |
Supérieur à |
11 > 10 |
TRUE |
>= |
Supérieur ou égal à |
40 >=10 40 >= 40 |
TRUE |
Pourquoi l’opérateur Égal à contient-il deux signes égal ? Rappelez-vous que nous avons utilisé un seul signe égal dans l’instruction suivante :
Un signe égal ( =
) constitue un opérateur d’attribution. Il attribue des valeurs. Deux signes égal ( ==
) constituent, eux, un opérateur de comparaison. Ils comparent deux valeurs pour déterminer si elles sont égales (true) ou différentes (false).
Les opérateurs sont particulièrement utiles lorsque vous souhaitez comparer une valeur connue à une variable, ou comparer les valeurs de deux variables différentes.
Integer numberOfTeaCups = 2; numberOfTeaCups == 3; //false numberOfTeaCups == 2; //true
Nous avons examiné un exemple contenant une variable entière (integer) et une variable chaîne (string). Nous pouvons également créer une variable booléenne contenant le résultat d’une comparaison. Observez :
Integer numberOfTeaCups = 2; Boolean result = numberOfTeaCups > 3; // 2 > 3 = false
La ligne 1 définit la variable numberOfTeaCups sur 2.
La ligne 2 crée une variable de type booléen nommée result
, compare la valeur de la variable numberOfTeaCups avec le nombre 3 et attribue le résultat de la comparaison (false) à la variable result
.
Bien que les comparaisons soient utiles pour déterminer la relation entre deux éléments, elles montrent toute leur puissance dans les instructions conditionnelles, où elles aident à prendre des décisions.
Instructions conditionnelles
Les développeurs utilisent des expressions dans des instructions conditionnelles pour créer des structures décisionnelles spécifiant une ou plusieurs conditions que le programme doit évaluer ou tester. Voilà qui semble complexe. Décomposons ces différents éléments.
Une instruction conditionnelle définit deux options ou plus. Si vous avez déjà créé des critères dans Flow Builder, cela signifie que vous avez déjà utilisé une instruction conditionnelle. Par exemple, « si l’État est égal à Californie, alors afficher les enregistrements dans la vue de liste » est une instruction conditionnelle. Ici, la condition est « l’État est égal à Californie » et « afficher les enregistrements dans la vue de liste » est l’action que le programme effectue uniquement lorsque la condition est vraie. Dans cet exemple, les deux options sont « afficher les enregistrements » (option explicite) et « ne pas afficher les enregistrements » (option implicite).
Instructions if-else
L’instruction if-else
est l’une des instructions conditionnelles couramment employées dans Apex. Elle se présente comme suit :
if(condition is true) { //do this } else { //do this }
La ligne 1 définit la condition (écrite entre parenthèses).
La ligne 2 contient le code à exécuter si la condition de la ligne 1 est vraie.
La ligne 3 introduit la deuxième option, l’option else.
La ligne 4 contient le code à exécuter si la condition de la ligne 1 est fausse.
Dans Apex, les instructions conditionnelles sont encadrées par des accolades : { }
. Chaque accolade ouverte ({
) doit être associée à une accolade fermée (}
). Lorsqu’un bloc de code a une accolade ouverte sans accolade fermée, une erreur se produit.
Utilisons une instruction conditionnelle dans notre pseudo-code Teatime pour vérifier le niveau d’eau dans la bouilloire et décider quoi faire en fonction de ce dernier.
- Dans la Developer Console, cliquez sur Débogage | Ouvrir la fenêtre d’exécution anonyme.
- Copiez le code suivant et collez-le dans la fenêtre Entrer du code Apex.
String waterLevel = 'full'; /*This variable keeps track of the water level status: full or empty*/ if(waterLevel == 'empty') { System.debug('Fill the tea kettle'); waterLevel = 'full'; /*Once the tea kettle is filled the variable is changed to full*/ } else { System.debug('The tea kettle is full'); }
- Cochez la case Ouvrir le journal, puis cliquez sur Exécuter. Le journal d’exécution s’ouvre et affiche le résultat de l’exécution de votre code.
- Cochez la case Déboguer uniquement en bas de la fenêtre.
Sur la ligne 1, nous avons initialisé la variable waterLevel sur full
. Généralement, les valeurs de variable dans le code sont saisies par les utilisateurs ou établies à partir d’autres données non contenues dans ce dernier. Dans notre exemple Teatime, nous pouvons déterminer le niveau d’eau en obtenant des données physiques à l’aide de capteurs présents dans la bouilloire. Lorsque de telles données ne sont pas disponibles, les développeurs définissent des valeurs directement dans le code (de manière temporaire) afin de pouvoir exécuter le code et le tester. Le fait de définir des valeurs directement dans le code est appelé codage en dur. À des fins de test, nous avons codé en dur la valeur de la variable waterLevel pour qu’elle soit égale à full
. Puisque cette valeur a déjà été définie, la première instruction if
(ligne 3) ne sera jamais exécutée, car waterLevel ne sera jamais définie initialement sur empty
.
Le code vérifie si la variable waterLevel est égale à empty
. Comme nous avons codé en dur la variable waterLevel pour que sa valeur soit égale à full
, la condition d’instruction if
est fausse. Lorsque la condition if
est fausse, le bloc de code else
est exécuté.
Notre code gère actuellement deux options : le niveau d’eau (waterLevel) est full
et le niveau d’eau est empty
. Mais il ne s’agit pas là des seules possibilités, n’est-ce pas ? Ainsi, la bouilloire peut être également partiellement remplie. Comment gérer plus de deux possibilités ?
Instructions if-else if
Pour gérer plus de deux possibilités, il faut utiliser une instruction if-else if. Cette dernière ajoute une autre condition if avant la condition else finale. Voyons, à l’aide d’un exemple, comment cela se traduit dans les faits.
- Dans la Developer Console, cliquez sur Débogage | Ouvrir la fenêtre d’exécution anonyme.
- Copiez le code suivant et collez-le dans la fenêtre Entrer du code Apex.
String waterLevel = 'half'; if(waterLevel == 'empty') { System.debug('Fill the tea kettle'); waterLevel = 'full'; } else if(waterLevel == 'half') { System.debug('Fill the tea kettle'); waterLevel = 'full'; } else { /*This statement only runs if line 3 and line 6 result in false.*/ System.debug('The tea kettle is full'); }
- Cochez la case Ouvrir le journal, puis cliquez sur Exécuter. Le journal d’exécution s’ouvre et affiche le résultat de l’exécution de votre code.
- Cochez la case Déboguer uniquement en bas de la fenêtre.
Profitez du fait que vous testiez le code pour modifier la valeur de la variable waterLevel
à la ligne 1. Le résultat affiché dans le journal de débogage reflètera ce changement. Essayez les trois valeurs suivantes : half
, full
et empty
.
Organisez les instructions conditionnelles de sorte que la première condition soit celle la plus fréquemment rencontrée. Cette disposition réduit la quantité de code qui s’exécute chaque fois que le bloc de code est exécuté. Dans notre exemple Teatime, il est fort probable que la bouilloire soit vide. Nous plaçons donc cette condition en premier. Comme il est peu probable que la bouilloire soit pleine, nous vérifions cette condition en dernier.
Instruction switch
Une alternative plus efficace à l’utilisation des instructions if-else est l’emploi de l’instruction switch. Une instruction switch spécifie un ensemble de valeurs et teste une expression pour déterminer si elle correspond à l’une d’entre elles. Voici à quoi cela ressemble :
switch on expression { when value1 { //code block 1 } when value2 { //code block 2 } when else { //if none of the previous values apply //code block 3 } }
Dans une instruction switch, vous pouvez ajouter une ou plusieurs valeurs après le mot réservé when
.
switch on expression { when value1 { //single value //code block 1 } when value2, value3 { //multiple values //code block 2 } }
Appliquons des instructions switch à notre pseudo-code Teatime.
- Dans la Developer Console, cliquez sur Débogage | Ouvrir la fenêtre d’exécution anonyme.
- Copiez le code suivant et collez-le dans la fenêtre Entrer du code Apex.
String waterLevel = 'empty'; //option 1 using a single value switch on waterLevel { when 'empty' { System.debug('Fill the tea kettle'); } when 'half' { System.debug('Fill the tea kettle'); } when 'full' { System.debug('The tea kettle is full'); } when else { System.debug('Error!'); } } //option 2 using multiple values switch on waterLevel { when 'empty', 'half' { //when waterLevel is either empty or half System.debug('Fill the tea kettle'); } when 'full' { System.debug('The tea kettle is full'); } when else { System.debug('Error!'); } }
- Cochez la case Ouvrir le journal, puis cliquez sur Exécuter. Le journal d’exécution s’ouvre et affiche le résultat de l’exécution de votre code.
- Cochez la case Déboguer uniquement en bas de la fenêtre.
Opérateurs logiques
Vous avez appris à gérer deux conditions ou plus. Toutefois, que faire lorsqu’une même condition peut être satisfaite par plus d’une valeur ?
Opérateurs logiques
Opérateur | OR | AND |
Symbole de l’opérateur | || | && |
Pseudo-code | Si X ou Y, réaliser cette action. Sinon, réaliser l’autre action. |
Si X et Y, réaliser cette action. Sinon, réaliser l’autre action. |
Code Apex |
if(X || Y) { |
if(X && Y) { |
Les opérateurs logiques and
et or
vous permettent d’écrire du code vérifiant plusieurs valeurs pour déterminer si une condition est vraie ou fausse. L’opérateur and
requiert que toutes les valeurs soient « true » pour satisfaire la condition. L’opérateur or
requiert qu’au moins une des valeurs soit « true » pour satisfaire la condition.
Analyse des opérateurs logiques
Opérateur logique | Syntaxe | Description |
---|---|---|
&& (AND) |
X && Y |
X et Y sont des valeurs booléennes. Si X et Y sont toutes les deux vraies (« true »), alors l’expression est vraie. Sinon, l’expression est fausse. |
|| (OR) |
X || Y |
X et Y sont des valeurs booléennes. Si X et Y sont toutes les deux fausses (« false »), alors l’expression est fausse. Sinon, l’expression est vraie. |
Essayons de manipuler les opérateurs logiques. Voici notre code, écrit sous la forme d’une instruction if-else if.
String waterLevel = 'half'; if(waterLevel == 'empty') { System.debug('Fill the tea kettle'); waterLevel = 'full'; } else if(waterLevel == 'half') { System.debug('Fill the tea kettle'); waterLevel = 'full'; } else { //This statement only runs if line 3 and line 6 result in false. System.debug('The tea kettle is full'); }
Observez les lignes 4 et 5 ainsi que 7 et 8 : vous remarquerez qu’elles sont identiques. Nous appelons cela du code redondant. Il est recommandé d’éliminer les redondances, car cela rend le code plus lisible et plus facile à comprendre, à déboguer et à gérer. Que la variable waterLevel ait pour valeur empty
ou half
, notre code exécute les mêmes actions. Nous pouvons donc le simplifier en associant empty
et half
dans une seule condition. Pour ce faire, utilisons l’opérateur or
pour satisfaire la condition lorsque l’une ou l’autre des valeurs (empty
ou half
) est vraie.
- Dans la Developer Console, cliquez sur Débogage | Ouvrir la fenêtre d’exécution anonyme.
- Copiez le code suivant et collez-le dans la fenêtre Entrer du code Apex.
String waterLevel = 'half'; if(waterLevel == 'empty' || waterLevel == 'half') { System.debug('Fill the tea kettle'); waterLevel = 'full'; } else { //This statement only runs if line 3 false. System.debug('The tea kettle is full'); }
- Cochez la case Ouvrir le journal, puis cliquez sur Exécuter. Le journal d’exécution s’ouvre et affiche le résultat de l’exécution de votre code.
- Cochez la case Déboguer uniquement en bas de la fenêtre.
Voilà qui est fait : nous avons supprimé notre redondance de code. L’utilisation d’opérateurs logiques (&&
et ||
) est un moyen efficace de supprimer du code redondant ou d’en réduire la quantité et d’améliorer ainsi la lisibilité.
Écriture d’un code propre
En programmation, il existe souvent plusieurs manières d’effectuer une action. Ainsi, vous pouvez parvenir au même résultat en utilisant des instructions switch ou if-else. Lorsque vous choisissez les types d’instructions que vous allez employer, il est important de réfléchir à l’influence de ces derniers sur la lisibilité de votre code. Plus vous manipulerez du code, plus vous découvrirez des techniques vous permettant de le rédiger de manière propre. Pour le moment, assurez-vous surtout que votre code soit facile à lire et à comprendre.