BaronFrancois / Projet-4-OC-D-veloppez-un-programme-logiciel-en-Python

0 stars 1 forks source link

Eviter les effets de bord de les méthodes de la classe View #1

Open arctenis opened 7 months ago

arctenis commented 7 months ago

Les méthodes de ta classe View doivent, autant que possible, éviter les effets de bord, c'est-à-dire modifier des données.

Ta méthode modify_player prend un paramètre players et en modifie le contenu. Il vaut mieux qu'elle renvoie une nouvelle liste avec tes mises à jour.

    def modify_player(self, players):
        self.list_players(players)
        player_index = int(input("Enter the index of the player you want to "
                                 "modify: ")) - 1

        if player_index < 0 or player_index >= len(players):
            print("Invalid player index.")
            return

        player = players[player_index]
        print(f"Modifying player: {player.last_name}, {player.first_name} "
              f"({player.chess_id})")

        last_name = input(f"Enter new last name (leave blank to keep "
                          f"'{player.last_name}'): ") or player.last_name
        first_name = input(f"Enter new first name (leave blank to keep "
                           f"'{player.first_name}'): ") or player.first_name
        birth_date = input(
            f"Enter new date of birth (YYYY-MM-DD) "
            f"(leave blank to keep '{player.birth_date}'): "
        ) or player.birth_date
        chess_id = input(f"Enter new national chess ID (leave blank to keep "
                         f"'{player.chess_id}'): ") or player.chess_id

        player.last_name = last_name
        player.first_name = first_name
        player.birth_date = birth_date
        player.chess_id = chess_id

Dans tes vues de toutes façon, tu ne dois t'occuper que de l'affichage. Mettre à jour tes données, c'est plutôt le rôle de ton contrôleur, via le cas échéant les méthodes de tes modèles.

En Python, quand tu passes un objet à une fonction en tant qu'argument, tu ne lui donnes pas une copie de l'objet, mais plutôt une référence directe à cet objet. Cela signifie que la fonction travaille directement avec l'objet d'origine en mémoire.

Lorsque tu modifies cet objet à l'intérieur de la fonction, les changements affectent l'objet d'origine lui-même, car tu travailles avec le même objet.

Cependant, si tu crées un nouvel objet à l'intérieur de la fonction, cela n'affecte pas l'objet d'origine, car c'est juste une nouvelle donnée locale à l'intérieur de la fonction.

En résumé, les objets mutables (comme les listes) peuvent être modifiés à l'intérieur de la fonction et ces modifications seront visibles en dehors de la fonction. En revanche, les objets immuables (comme les nombres et les chaînes de caractères) ne peuvent pas être modifiés à l'intérieur de la fonction de manière permanente.

Et ça risque de te jouer des tours par la suite.

arctenis commented 7 months ago

Idem pour modify_tournament du coup.