Oui, le titre de ce chapitre sonne comme le début d'un mauvais film d'horreur des années 80... Et pour autant, nous allons parler d'un sujet très sérieux en programmation : la Pyramide Condamnée (ou Pyramid of Doom en anglais, tout de suite ça fait moins rire... Ils sont forts ces Américains...) !
La pyramide condamnée
Très bien, mais c'est quoi ?
Une illustration vaut mille mots, alors je vous laisse apprécier ce gif :
La pyramide condamnée, c'est donc quand on a des conditions les unes dans les autres qui forment une pyramide immense et rendent le code assez peu agréable à lire, à cause de toutes les indentations.
Et comme vous le savez, la lisibilité du code est tout sauf optionnelle ! C'est ce qui fera de vous des bons ou des mauvais développeurs. Donc on va prendre ce problème très au sérieux et le résoudre grâce au mot-clé guard
.
Le mot-clé guard
Le mot-clé guard
est un cousin de la combinaison if-else
. Il permet lui aussi de contrôler des conditions, mais avec une syntaxe un peu particulière.
Prenons un exemple : si vous voulez contrôler qu'il n'y a pas d'erreur, vous allez écrire :
if error == nil {
print("Tout va bien !")
} else {
print("Oups ! Il y a une erreur.")
}
Jusque-là, rien de nouveau. Maintenant écrivons la même chose avec le mot-clé guard :
guard error == nil else {
print("Oups ! Il y a une erreur.")
return
}
print("Tout va bien !")
C'est un petit peu déroutant au début, alors prenons le temps de détailler :
On écrit d'abord le mot-clé
guard
suivi d'une condition ; jusque-là ça ressemble au if.Ensuite, on écrit tout de suite le
else
suivi du code correspondant au cas où la condition n'est pas respectée.Ensuite, on écrit le mot-clé
return
qui empêche la suite du code de s'exécuter s’il y a une erreur.Enfin, on sait que l'erreur a été traitée s'il y en avait une, donc on peut exécuter le code correspondant au cas où la condition est respectée.
Ce mécanisme permet de traiter les erreurs d'abord, et ensuite d'exécuter son code sereinement. On appelle ce mécanisme early exit. Car guard fournit une porte de sortie rapide du code si la condition est évaluée à false
, sinon le code continue de s'exécuter.
Voici du coup la représentation schématique de guard :
guard condition else {
// Code si false
return
}
// Code si true
guard-else vs if-else
OK, mais du coup quand doit-on utiliser guard plutôt que if ?
guard
ou if
, que choisir ? Telle est la question ! La réponse est assez simple :
On utilise if
pour faire de la logique entre plusieurs cas et guard
pour prévenir une erreur.
Prenons un exemple : si je veux vérifier que l'utilisateur a bien rentré un e-mail dans un champ de texte, il s'agit plutôt de prévenir une erreur, donc je vais utiliser guard
:
guard text.isEmail else {
print("Vous n'avez pas rentré un e-mail correct.")
return
}
print("Merci pour votre e-mail !")
Maintenant, imaginons que je lui demande son âge et que selon son âge, il va avoir le droit à des accès différents :
if age >= 18 {
print("Vous avez accès au bar.")
} else {
print("Vous avez accès à la salle de billard.")
}
Ici, il ne s'agit pas de renvoyer une erreur ou non, mais d'articuler une logique selon plusieurs cas, donc j'utilise if
.
En résumé
La pyramide condamnée apparaît lorsqu'on enchaîne les conditions les unes dans les autres en obtenant des indentations de plus en plus grandes.
Le mot-clé
guard
permet de casser la pyramide condamnée en permettant la gestion d'erreur au même niveau que le cas nominal.Le mot-clé
guard
s'utilise avec la syntaxe suivante :
guard condition else {
// Code si false
return
}
// Code si true
On utilise
if
pour faire le lien logique entre plusieurs cas, etguard
pour prévenir une erreur.
Bravo ! Vos appels réseaux sont désormais de grande qualité, vous pouvez être fier de vous ! Ce qui fera vraiment la différence néanmoins, ce sera votre capacité à faire du code stable. Et qui dit stable, dit testable ! Or, tester les appels réseau ne sera pas forcément votre tasse de thé... sauf si vous passez simplement au chapitre suivant !