Adloun

Nour et Camille ont modifié la même fonction

Exercice supplémentaire · niveau 3 (difficile) · NSI (première), chapitre 11 — Conduire un projet · Versionner, outiller

Énoncé

Nour et Camille ont modifié la même fonction. À la fusion, le fichier contient ceci :


def jouer_coup(g, i, j, joueur):
<<<<<<< HEAD
    if coup_legal(g, i, j):
        appliquer(g, i, j, joueur)
=======
    assert coup_legal(g, i, j), "coup illegal"
    appliquer(g, i, j, joueur)
>>>>>>> camille

Corrigé

1. &lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD ouvre votre version, celle de la branche courante ; ======= sépare ; &gt;&gt;&gt;&gt;&gt;&gt;&gt; camille ferme celle qui arrive, écrite par Camille. L'outil n'a rien choisi : il a recopié les deux et vous les soumet.

2. Parce que les deux modifications portent sur les mêmes lignes. Un outil de fusion combine sans rien demander deux modifications situées à des endroits différents ; sur les mêmes lignes, il ne dispose d'aucun critère. Et pour cause : le désaccord n'est pas typographique, il est de spécification. Nour a décidé qu'un coup illégal est ignoré silencieusement ; Camille, qu'il arrête le programme. Ce sont deux comportements différents, et seul le groupe peut dire lequel est voulu.

3. Le fichier n'est plus du Python valide : &lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD provoque une SyntaxError dès l'import. Le programme ne démarre plus du tout, et le message d'erreur ne parle pas de fusion. Enregistrer un fichier contenant des marqueurs est l'accident classique du premier conflit — d'où la règle : on relance les tests avant d'enregistrer une fusion.

4. La bonne résolution n'est ni « prendre la version de Nour » ni « prendre celle de Camille » : c'est décider, puis écrire ce qu'on a décidé. Ici, la version de Camille est préférable — un coup illégal ne doit pas être avalé en silence — et l'appelant doit alors être protégé :


def jouer_coup(g, i, j, joueur):
    """Applique le coup. Precondition : coup_legal(g, i, j).
    Un coup illegal arrete le programme : c'est a l'appelant de
    verifier avant d'appeler."""
    assert coup_legal(g, i, j), "coup illegal"
    appliquer(g, i, j, joueur)

Puis : effacer les trois marqueurs, relancer les tests, préparer et enregistrer.

Ce qu'il fallait faire pour l'éviter : fixer, au moment des prototypes, ce que fait le programme d'un coup illégal. Le conflit n'a pas été créé par l'outil ni par la simultanéité — il a été créé par une décision qui n'avait pas été prise, et que deux personnes ont donc prise chacune de son côté.

Ce qu'un conflit est vraiment : une question restée sans réponse dans le cahier des charges, découverte au moment où deux réponses se rencontrent. L'outil ne crée pas le désaccord ; il le rend visible, et c'est son mérite.

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.