Modularité, mise au point et tests
Cours · NSI (terminale), chapitre 10 · terminale, spécialité numérique et sciences informatiques · le début du chapitre, la suite sur Adloun
Écrire un programme qui fonctionne est une chose ; écrire un programme fiable, lisible et maintenable en est une autre. Lorsqu'un projet grossit, il devient impossible de tout placer dans un seul fichier monolithique : on découpe alors le code en modules et en fonctions réutilisables. Mais découper ne suffit pas : encore faut-il documenter ce que fait chaque fonction, vérifier qu'elle se comporte comme prévu grâce à des jeux de tests, et corriger les erreurs qui apparaissent inévitablement.
Ce chapitre présente les outils et les méthodes du développeur professionnel : la modularité (fonctions, modules, imports, bibliothèques), la documentation (docstring, spécification, préconditions), les jeux de tests et les assertions, les types d'erreurs et les techniques de débogage, ainsi que les pratiques de gestion de projet et de travail collaboratif fondées sur le versionnage.
10.1 La modularité
10.1.1 Pourquoi découper un programme ?
Un programme bien conçu est constitué de briques indépendantes, chacune réalisant une tâche précise. Cette organisation présente plusieurs avantages :
- Réutilisabilité : une fonction écrite une fois peut être appelée autant de fois que nécessaire, dans plusieurs programmes.
- Lisibilité : un découpage en sous-problèmes rend le code plus facile à comprendre.
- Maintenabilité : corriger ou améliorer une fonctionnalité se fait à un seul endroit.
- Testabilité : chaque brique peut être testée isolément.
La modularité est le principe de conception qui consiste à décomposer un programme en unités autonomes et réutilisables : les fonctions, regroupées au sein de modules, eux-mêmes parfois regroupés en bibliothèques (ou paquets).
10.1.2 Les fonctions
La fonction est l'unité de base de la modularité. Elle reçoit des paramètres, effectue un traitement et renvoie un résultat grâce à l'instruction return.
Une fonction est un bloc de code nommé, qui peut recevoir des arguments en entrée et renvoyer une valeur en sortie. Elle encapsule un traitement de manière à pouvoir être appelée par son nom.
def aire_rectangle(longueur, largeur):
return longueur * largeur
surface = aire_rectangle(5, 3)
print(surface) # affiche 15
La fonction aire_rectangle prend deux paramètres et renvoie leur produit. Une fois définie, elle peut être réutilisée partout dans le programme.
Une variable définie à l'intérieur d'une fonction est locale : elle n'existe que pendant l'exécution de la fonction et n'est pas accessible à l'extérieur. Les variables définies au niveau principal du programme sont globales. Cette séparation évite les effets de bord et rend les fonctions indépendantes les unes des autres.
10.1.3 Les modules
Lorsqu'un ensemble de fonctions traite d'un même sujet, on les regroupe dans un module, c'est-à-dire un fichier .py dédié.
Un module est un fichier source Python (extension .py) contenant des définitions (fonctions, constantes, classes) destinées à être réutilisées par d'autres programmes via le mécanisme d'import.
Méthode : Créer et importer un module
- On écrit les fonctions dans un fichier, par exemple
geometrie.py. - Dans un autre fichier situé dans le même dossier, on importe le module.
- On accède aux fonctions du module par la notation
nom_module.nom_fonction.
# fichier geometrie.py
def aire_cercle(rayon):
return 3.14159 * rayon ** 2
# fichier principal.py
import geometrie
print(geometrie.aire_cercle(2)) # 12.56636
import math # importe tout le module
print(math.sqrt(16)) # 4.0
from math import sqrt # importe une fonction precise
print(sqrt(25)) # 5.0
from math import pi as PI # importe en renommant
print(PI) # 3.141592653589793
La forme import math est la plus claire car elle indique explicitement la provenance de chaque fonction. La forme from math import * (tout importer) est déconseillée : elle masque l'origine des noms et peut provoquer des conflits.
Exercices du chapitre
- Cas limites et tests corrigé
- Précondition et postcondition corrigé
- Détecter une erreur logique corrigé
- Problème — Débogage guidé par les tests corrigé
- Documenter et tester une fonction corrigé
- Découper en modules corrigé