Des fonctions qui s'appellent entre elles
Une fonction peut en appeler une autre. C'est ce qui permet de construire un gros calcul avec de petites briques simples, chacune facile à comprendre et à vérifier.
Un problème à étages
Combien de pots de peinture faut-il pour repeindre les murs d'une pièce ? Découpons :
- la surface d'un mur : largeur × hauteur ;
- la surface des quatre murs de la pièce ;
- les litres nécessaires : un litre couvre 10 m² ;
- le nombre de pots de 2,5 litres, arrondi au pot supérieur.
Chaque étape s'appuie sur la précédente. On écrit donc une fonction par étape.
Brique après brique
// Surface d'un mur rectangulaire
fonction surfaceMur(largeur, hauteur)
retourne largeur * hauteur
fin fonction
// Surface des quatre murs d'une pièce
fonction surfacePiece(cote1, cote2, hauteur)
retourne 2 * surfaceMur(cote1, hauteur) + 2 * surfaceMur(cote2, hauteur)
fin fonction
// Litres de peinture : un litre couvre 10 m²
fonction litresPeinture(surface)
retourne surface / 10
fin fonction
// Nombre de pots de 2,5 litres
fonction nombrePots(litres)
retourne arrondi_superieur(litres / 2.5)
fin fonction
affiche surfaceMur(4, 2.5) // 10
affiche surfacePiece(4, 3, 2.5) // 35
affiche litresPeinture(35) // 3,5
affiche nombrePots(3.5) // 2
surfacePiece ne refait pas le calcul largeur × hauteur : elle appelle surfaceMur. Si un jour la formule change, on ne la corrige qu'à un seul endroit.
Chaque fonction est testée séparément, avec un exemple vérifié à la main.
Question : Pour une pièce de 5 m sur 4 m, haute de 2 m, que renvoie surfacePiece(5, 4, 2) ? — 36. Deux murs de 5 × 2 = 10 m² et deux murs de 4 × 2 = 8 m² : 20 + 16 = 36 m².
Enchaîner les appels
Le résultat d'une fonction peut être donné directement à une autre. Place ces lignes sous les quatre fonctions :
// en plusieurs étapes, avec des variables
surface est un nombre vaut surfacePiece(4, 3, 2.5)
litres est un nombre vaut litresPeinture(surface)
affiche 'Pots à acheter : ' + nombrePots(litres)
// en une seule ligne
affiche 'Pots à acheter : ' + nombrePots(litresPeinture(surfacePiece(4, 3, 2.5)))
Les deux écritures donnent le même résultat. La seconde se lit de l'intérieur vers l'extérieur : d'abord surfacePiece, puis litresPeinture, puis nombrePots.
Quand une ligne imbrique plus de deux appels, elle devient difficile à lire. Les variables intermédiaires, avec des noms clairs, valent souvent mieux.
Une fonction qui résume tout
Dernière brique : une fonction qui répond directement à la question de départ. Elle ne contient aucun calcul : elle orchestre les autres.
fonction surfaceMur(largeur, hauteur)
retourne largeur * hauteur
fin fonction
fonction surfacePiece(cote1, cote2, hauteur)
retourne 2 * surfaceMur(cote1, hauteur) + 2 * surfaceMur(cote2, hauteur)
fin fonction
fonction potsPourPiece(cote1, cote2, hauteur)
surface est un nombre vaut surfacePiece(cote1, cote2, hauteur)
retourne arrondi_superieur(surface / 10 / 2.5)
fin fonction
affiche 'Salon : ' + potsPourPiece(6, 4, 2.5) + ' pots'
affiche 'Chambre : ' + potsPourPiece(3.5, 3, 2.5) + ' pots'
affiche 'Couloir : ' + potsPourPiece(5, 1.2, 2.5) + ' pots'
Le programme principal n'a plus qu'une ligne par pièce. Toute la complexité est rangée dans les fonctions.
Pourquoi découper autant ?
- Chaque brique est simple : une ligne ou deux, faciles à vérifier.
- Chaque brique a un nom : le code se lit presque comme du français.
- Les briques se réutilisent :
surfaceMur servira aussi pour calculer du papier peint ou du carrelage. - Une erreur se localise vite : si le nombre de pots est faux, on teste les fonctions une à une.
En résumé
- Une fonction peut appeler d'autres fonctions.
- On construit du simple vers le complexe, en testant chaque brique.
- Les appels imbriqués se lisent de l'intérieur vers l'extérieur.
- Une formule écrite une seule fois ne se corrige qu'à un seul endroit.