Guide

Guide : Bien commenter son code

Un commentaire n'est pas là pour dire ce que fait le code. Le code le dit déjà. Il est là pour dire ce que le code ne peut pas dire .

  • Durée 20 min de lecture, à garder sous la main
Sommaire de la page
  1. 1. Ce que ton prof attend
  2. 2. Le test du lecteur
  3. 3. Les trois outils, du plus fort au plus faible
  4. 4. Quand un commentaire est utile
  5. 5. Quand un commentaire est nuisible
  6. 6. Le style
  7. 7. Un exemple complet, avant et après
  8. 8. La checklist avant de rendre

On apprend rarement à commenter, alors que c'est ce qui rend un code lisible… et ce que ton correcteur regardera. Ce guide rassemble toutes les règles. Chaque jour, le coin des commentaires de la fiche en travaille une.

JourLe coin des commentaires
LundiQu'est-ce qu'un bon commentaire ? L'intention, pas la traduction
MardiUn bon nom vaut mieux qu'un commentaire, et les docstrings
MercrediCommenter le pourquoi, et chasser les nombres magiques
JeudiDocumenter ses classes et ses méthodes
VendrediBaliser les étapes d'une méthode longue
SamediLes commentaires qui mentent, et le code mort
DimancheLa revue finale, et la checklist avant de rendre

1. Ce que ton prof attend

Le cahier des charges du projet est très clair : un code avec un commentaire à chaque ligne n'est pas un code valable. Les commentaires servent à décrire l'intention d'une portion de code, pas à réécrire le programme en français.

Autrement dit, ton correcteur pénalise autant le trop que le pas assez.


2. Le test du lecteur

Pour chaque commentaire, pose-toi une seule question :

Si je supprime ce commentaire, est-ce que quelqu'un qui connaît Python perd une information ?

  • Non → le commentaire est inutile : supprime-le.
  • Oui → garde-le, et vérifie qu'il est clair et juste.
x += speed * dt          # on ajoute speed fois dt à x

Ce commentaire ne survit pas au test : n'importe quel lecteur voit qu'on ajoute speed * dt à x.

x += speed * dt          # speed est en pixels par seconde, dt en secondes

Celui-ci survit : les unités ne se voient pas dans le code.


3. Les trois outils, du plus fort au plus faible

3.1 D'abord, les noms

Le meilleur commentaire est celui dont on n'a pas besoin, parce que le code se lit tout seul.

❌

def f(a, b, t):
    # calcule la position entre a et b
    return a + (b - a) * t

v = 3  # vitesse de la voiture

✅

def lerp(start, end, t):
    return start + (end - start) * t

car_speed = 3

Choisis des noms qui disent ce que c'est (frog, time_left, raft_under_frog) plutôt que des lettres ou des abréviations. Une fonction a un nom de verbe (create_cars, lose_life), une fonction qui répond à une question a un nom de question (is_jumping, is_on_screen).

3.2 Ensuite, les docstrings

Une docstring est un texte entre triples guillemets placé juste en dessous d'un def ou d'une class (ou tout en haut d'un fichier). Elle dit ce que fait la fonction ou ce que représente la classe, du point de vue de celui qui l'utilise.

def lane_positions(count: int, length: int) -> list:
    """Renvoie les positions x de count obstacles répartis sans chevauchement sur une voie."""
    ...


class Frog:
    """La grenouille du joueur, repérée en pixels et animée pendant ses sauts."""

À la différence d'un commentaire #, Python garde la docstring : ton éditeur l'affiche quand tu survoles la fonction, et help(lane_positions) l'affiche dans le terminal.

  • Une phrase suffit la plupart du temps.
  • Elle dit quoi, pas comment : « renvoie les positions », pas « fait une boucle sur count et tire un nombre au hasard ».
  • Pas besoin de docstring pour une fonction évidente : draw(self, screen) ou is_jumping(self) se passent d'explication.

3.3 Enfin, les commentaires #

Un commentaire # explique ce que ni les noms ni la docstring ne peuvent dire : pourquoi le code est écrit comme ça.

# Les règles suivantes ne s'appliquent qu'une fois la grenouille posée
if self.frog.is_jumping():
    return

4. Quand un commentaire est utile

SituationExemple
Le pourquoi d'un choix qui ne se voit pas# On teste le centre : une grenouille ne tient pas sur un radeau du bout d'une patte
Une règle du jeu que le code applique# Une maison déjà occupée fait perdre une vie, comme la haie
Une astuce ou une formule non évidente# Nul au départ et à l'arrivée, maximal au milieu du saut
Les unités d'une valeurJUMP_TIME = 0.15 # en secondes
L'intention d'un bloc dans une méthode longue# Pointillés entre les voies de la route
Un piège que le prochain lecteur pourrait « corriger » à tort# On décale aussi target_x, sinon la grenouille fait un bond en arrière au saut suivant
Le rôle d'un fichier (docstring de module)"""Sauvegarde et lecture du tableau des meilleurs scores."""

5. Quand un commentaire est nuisible

ProblèmeExempleQue faire
Il répète le codelives -= 1 # on enlève une vieSupprimer.
Il compense un mauvais nomt = 30 # temps restantRenommer (time_left), puis supprimer.
Il est faux ou périmé# vitesse de 2 au-dessus de speed = 3Corriger ou supprimer. Un commentaire faux est pire que pas de commentaire.
C'est du code mort# self.y += self.vSupprimer. Git (ou une copie) garde l'historique.
C'est une note de travail# TODO, # test, # ça marche pas ???Traiter, puis supprimer avant de rendre.
Il remplace une constanteif y > 480: # hauteur de l'écranCréer SCREEN_HEIGHT = 480, puis supprimer.
Il explique un code trop compliquéDix lignes de commentaire pour une méthode de 40 lignesDécouper en petites méthodes bien nommées.

6. Le style

  • Un dièse, une espace, puis une phrase : # Les maisons sont régulièrement espacées.
  • Écris en français correct, avec une majuscule. Une seule langue pour tout le projet.
  • Le commentaire d'un bloc se place au-dessus du bloc, au même niveau d'indentation.
  • Le commentaire en fin de ligne est réservé aux courtes précisions (unités, valeur particulière) : TIME_LIMIT = 30 # secondes par grenouille.
  • Reste court. Si un commentaire dépasse trois lignes, demande-toi si le code ne devrait pas être plus simple.

7. Un exemple complet, avant et après

❌ Avant : trop de commentaires, et pas les bons.

# fonction move
def move_obstacles(obstacles, dt):
    # boucle sur les obstacles
    for o in obstacles:
        # on bouge
        o[0] += o[3] * dt
        # si plus grand que 624
        if o[3] > 0 and o[0] > 624:
            # on remet à gauche
            o[0] = -o[2]
        # sinon si
        elif o[3] < 0 and o[0] + o[2] < 0:
            o[0] = 624  # à droite

✅ Après : de bons noms, des constantes, et un seul commentaire qui dit pourquoi.

def update(self, dt: float) -> None:
    self.x += self.speed * dt
    # Un obstacle sorti d'un côté réapparaît de l'autre, entièrement caché
    if self.speed > 0 and self.x > WIDTH:
        self.x = -self.width
    elif self.speed < 0 and self.x + self.width < 0:
        self.x = WIDTH

8. La checklist avant de rendre

Du nouveau dans le cours

Petite rectification

Il manquait une étape au cours : comprendre ce qu'est un jeu vidéo avant de le coder. Une nouvelle section t'explique la boucle de jeu et le plan __init__ / process_events / update / draw que suivront tous les éléments de ton Frogger.