/* Page prose (fr) */
"WhereBugsHide" = "# Compte les endroits où un bug peut se cacher\n\nCe seul résultat sur le chemin heureux cache beaucoup de façons de manquer de chance. Parcours le code et fais-en le compte :\n\n* **L'imbrication elle-même.**  \nTrois étapes, trois niveaux d'indentation, et la vraie logique (\"relier le livret\") se trouve le plus à droite, la plus difficile à trouver. C'est la **pyramide de la mort** : une structure d'appels qui grandit latéralement à chaque étape dépendante.\n* **Trois chemins d'erreur séparés.**  \nChaque `.failure` doit se souvenir d'appeler `completion(.failure(error))`. En rate un et cet échec disparaît en silence ; la complétion de l'appelant n'est tout simplement jamais appelée.\n* **La complétion facile à oublier.**  \nIl n'y a aucune règle du compilateur qui dise \"tu dois appeler `completion` sur chaque chemin\". Ajoute une quatrième branche, oublie le callback, et la page se bloque pour toujours sans erreur.\n* **La capture de `self`.**  \nComme un handler survit à la fonction qui l'a démarré, capturer `self` fortement peut garder le `PrintShop` en vie plus longtemps que prévu. On a écrit `[weak self]`, mais *se souvenir* de le faire, et le faire correctement, c'est manuel.\n* **Le saut vers le thread principal.**  \n`bindBooklet` rend compte sur une file d'arrière-plan. On a ajouté `DispatchQueue.main.async` pour qu'une mise à jour de l'UI soit sûre. Oublie-le, et tu obtiens un bug qui ne se comporte mal que *parfois*, le pire genre à traquer.\n\nAucun de ceux-là n'est exotique. Chacun est un mardi ordinaire dans une base de code fondée sur les closures. Le modèle n'est pas *faux* ; il fait juste de la correction *ta* responsabilité à chaque couture.\n\n[Précédent](@previous)  |  page 4 sur 6  |  [Suivant: Le même travail, réécrit](@next)";
