Voici une fonction et sa documentation
Application directe du cours · niveau 1 (application) · NSI (première), chapitre 11 — Conduire un projet · Spécifier et documenter
Énoncé
Voici une fonction et sa documentation.
def prochain_joueur(g):
"""Renvoie le joueur qui doit jouer. Marche a tous les coups."""
return "X" if sum(l.count(".") for l in g) % 2 == 1 else "O"
La docstring est malhonnête sur deux points. Lesquels ? La récrire.
Corrigé
Les deux défauts.
- Elle ne dit pas ce qu'elle exige. La fonction suppose que
gest une grille dont les cases valent"X","O"ou".", et que X a commencé. Aucune de ces trois hypothèses n'est écrite ; sur une grille où O a commencé, la réponse est fausse sans que rien ne le signale. - « Marche à tous les coups » ne veut rien dire. Une docstring ne promet pas, elle décrit : ce qu'il faut lui donner, ce qu'elle rend, ce qu'elle ne garantit pas. Une phrase rassurante à la place d'une précondition est pire que rien, puisqu'elle dissuade de vérifier.
La version honnête.
def prochain_joueur(g):
"""Renvoie "X" ou "O", le joueur dont c'est le tour.
Precondition : g est une grille 3x3 de "X", "O" et "." ; la
partie a commence par X ; les coups ont alterne.
Ne verifie pas que la partie est encore en cours : sur une
grille deja gagnee, renvoie tout de meme un joueur.
"""
assert len(g) == 3 and all(len(ligne) == 3 for ligne in g)
return "X" if sum(l.count(".") for l in g) % 2 == 1 else "O"
La dernière phrase est celle qui coûte le plus à écrire, et c'est la plus utile : elle énonce ce que la fonction ne fait pas. C'est la même exigence que « dire les limites » à l'oral, et que la quatrième ligne de la fiche de spécification — trois formes d'une seule discipline : ne promettez que ce que vous garantissez.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.