TP ChessSturm POO

Avant de démarrer votre travail sur ce projet, je vous conseil de lire le scénario en entier.

 

Scénario

Vous avez récemment décidé de mettre à profit vos nouvelles compétences en programmation Python en tant que développeur indépendant. Vous n’avez eu pour expérience que l’écriture de scripts simples pour votre ordinateur, qui automatisent des tâches courantes comme la vérification de vos boîtes de réception et la collecte de titres de vos sites d’information préférés. 

Une première opportunité de travailler pour un projet client potentiel apparaît lorsque votre amie Elie, membre du club d’échecs local, vous raconte sa récente expérience de tournoi. 

“C’était un désastre total”, dit-elle. “Après que nous avons eu terminé le premier tour, Internet a cessé de fonctionner et le directeur du tournoi n’a pas pu entrer les scores sur le site des résultats. Il a essayé d’utiliser son téléphone, mais cela n’a pas fonctionné non plus. Finalement, quelqu’un s’est porté volontaire pour aller chez lui et entrer les scores depuis son ordinateur personnel. Mais lorsqu’ils ont essayé, ils ont dit que le site lui-même était en panne ! Certaines personnes ont commencé à sortir, et j’ai même entendu quelqu’un dire que ce n’était pas la première fois qu’ils voyaient des problèmes avec l’organisation du tournoi. Finalement, le tournoi a été reprogrammé pour la semaine prochaine. C’était horrible !”.

À ce stade, vous suggérez que vous pourriez aider le club en écrivant un outil qui a la même fonctionnalité, mais qui fonctionne hors ligne. Elie dit qu’elle évoquera cette idée la prochaine fois qu’elle se rendra au club.

Édouard, l’organisateur du club d’échecs, vous envoie un mail. Elie a glissé un mot en votre faveur, et le club s’intéresse à votre idée. Ils aimeraient que vous écriviez un nouveau logiciel de tournoi qui leur permettrait de gérer leurs événements hors ligne, et de produire des rapports. Ils vous proposent de venir à une réunion le lendemain, et vous acceptez ! 

Lors de la réunion, vous parlez à Édouard et à l’assistant informatique, Charlie. Vous découvrez que les tournois d’échecs du club sont gérés selon le système de tournois “suisse”, et que votre outil devrait implémenter cet algorithme.

En traduisant les exigences en tâches techniques, voici ce que vous avez appris de votre conversation avec l’organisateur :

  • Vous allez créer des classes qui vous serviront de modèles pour le tournoi, les joueurs, les matchs et les rondes.
  • Vous écrirez des contrôleurs pour accepter les données de l’utilisateur, produire les résultats des matchs, lancer de nouveaux tournois, etc.
  • En plus de cela, il y aura des vues pour afficher les classements, les appariements et d’autres statistiques.

Comme ils savent qu’il s’agit de votre premier projet client, ils veulent avoir l’assurance que votre code sera propre et maintenable. En tant que passionné de Python, vous savez immédiatement qu’ils veulent vous voir suivre les directives de style de code – la PEP 8 en particulier.

La semaine suivante, vous recevez un mail de Charlie contenant la spécification technique du programme :
 


Vous recevez également un second mail de Charlie contenant des conseils spécifiques sur la sauvegarde et le chargement de l’état du programme. 

Avec tout cela en main, vous êtes prêt à commencer ! 

Etape 1: Définir (et coder) les modèles pour ce
projet

📌 Recommandations :


 Dans ce projet, vous devez utiliser le modèle «MVC » (Models, Views, Controllers). Le principal avantage de cette approche est qu’elle met en œuvre le principe de «séparation des responsabilités ». Chaque composant/classe est indépendant et responsable de sa propre tâche bien définie (contenir des données/attributs sur les entités, afficher quelque chose à l’écran, gérer la logique du programme…).
Cependant, mettre en œuvre ceci à partir de zéro peut être
décourageant la première fois. Le meilleur moyen pour y parvenir est de
commencer par les modèles : avec quelles entités votre programme
va-t-il fonctionner? Doivent-elles contenir des données (= attributs)?
Appliquent-elles des comportements spécifiques (= méthodes)?
Pour commencer, votre programme s’appuiera (au minimum) sur des
tournois, des tours, des matchs et des joueurs.
● Quels sont les attributs requis pour chacune de ces entités?
● Quels sont les comportements de ces entités? Par exemple,
comment les joueurs sont-ils associés lors des tours?

⚠️ Les erreurs à éviter :
● L’algorithme suisse permettant d’associer les joueurs peut être
compliqué à mettre en œuvre correctement. Il est probable que vous
vous retrouviez avec des correspondances non optimales. Ce n’est
pas l’objectif principal du projet, faites au mieux!
● N’essayez pas encore de mettre en œuvre une conception MVC
complète! Commencez simplement avec vos modèles et
assurez-vous qu’ils fonctionnent comme prévu. Vous pouvez utiliser
des « données statiques » ou générer des valeurs de manière
aléatoire pour une expérience plus authentique.
● Assurez-vous que vos modèles sont bien séparés. Vous pouvez écrire
de petits « scripts » ou des programmes qui importent les modèles
requis, créent quelques instances (voir ci-dessus), les font interagir et
affichent les résultats. Exemple :
○ créer quelques joueurs ;
○ créer un tour, ajouter les joueurs ;
○ voir comment les joueurs sont associés (classements) ;
○ gagner/perdre des matchs de manière aléatoire ;
○ vérifier que les données des modèles sont correctement mises à
jour.
● Ça pourrait être le bon moment pour vous familiariser avec les tests
unitaires. Mais ce n’est pas requis dans les livrables du projet.

Etape 2: Mettre en œuvre la conception MVC

📌 Recommandations : 

Maintenant que vos modèles sont fonctionnels, complets et testés, vous pouvez commencer à travailler sur les autres composants : les contrôleurs et les vues. Les contrôleurs sont responsables de la logique du programme et les vues sont responsables de l’affichage (et en partie, de la réception) des données à destination
(ou en provenance) de l’utilisateur.

● Dans ce programme, les vues s’afficheront sur la console. Même si elles utiliseront principalement des `print` (et peut-être des `input`) pour traiter les données, il est important de les garder séparées pour respecter la distinction des responsabilités dans la conception MVC. C’est le principe de la « responsabilité unique » : chaque
composant ne doit avoir qu’un seul rôle à jouer dans le code.

● Les contrôleurs peuvent être imbriqués.

○ Vous pouvez avoir un contrôleur « Application », qui instanciera :

■ un contrôleur `MenuManager`;
■ un contrôleur `TournamentManager`;
■ un contrôleur `UserManager`.

○ Ce ne sont là que des exemples ! C’est votre projet et vous pouvez choisir les contrôleurs à utiliser.

● En plus de la conception MVC, vous pouvez vous familiariser (et utiliser) d’autres modèles de conception. Pour les interfaces utilisateur, il est courant d’utiliser le modèle `Command` et parfois le modèle `State` (pour les menus).

Les erreurs à éviter :
● Essayez de « faire simple ».
● Vous verrez peut-être des débats sur la question de savoir si une vue
doit ou non être capable de « recevoir des données de l’utilisateur »
ou seulement « d’afficher des données à l’utilisateur ». Chacun son
point de vue! Les modèles de conception sont des directives
générales et chaque équipe ou projet peut avoir sa propre
interprétation/mise en œuvre.
● Le plus important dans ce projet est de comprendre le principe de la
« responsabilité unique ». Votre conception MVC n’est peut-être pas
parfaite, mais elle reste acceptable.

Étape 3 : Implémenter la sérialisation


📌 Recommandations : Votre projet devrait maintenant être en grande
partie fonctionnel. Ce qui lui manque, c’est la possibilité de lire et
d’enregistrer des données de manière continue. Vous utiliserez le
framework TinyDB, qui est une base de données persistante de type
JSON. N’hésitez pas à en apprendre davantage sur JSON et la
persistance des données, sur lesquels TinyDB s’appuie et que vous
continuerez à utiliser.
● Si vos modèles n’en disposent pas encore, mettez en place un moyen
de créer des instances à partir d’un « dictionnaire » ou de données
orientées texte.
● Implémentez une méthode `save` sur vos modèles, qui sérialise tous
les attributs de vos entités.
● Connectez ces deux méthodes à la base de données.
● Essayez de conserver une approche orientée objet lorsque vous
traitez avec la base de données !
⚠️ Les erreurs à éviter :
● Essayez de vous assurer que vous ne lisez ou n’écrivez pas trop
depuis/vers la base de données. N’apportez des modifications que
lorsque cela est nécessaire!
📃 Ressources (en anglais) :
● Documentation officielle de Tiny

Etape 4 : Faites une pause et nettoyez tout !



📌 Recommandations : Votre projet devrait maintenant être
entièrement conforme au cahier des charges. Relisez votre code, prenez
le temps de vous assurer qu’il répond aux meilleures pratiques
(docstrings, PEP8, etc.).
● Assurez-vous que votre code est bien organisé. Il semble logique
d’utiliser des packages tels que `views`, `controllers` et `models`.
Ceux-ci devraient à leur tour contenir des modules Python,
généralement un pour chacune de vos classes.
● Vous aurez besoin de mettre en place des outils pour dégrossir et
embellir votre code : `Flake8`, `Black` ou `Isort`.
● Vous voudrez peut-être publier votre code sur GitHub, assurez-vous
qu’il comporte un fichier README contenant les informations
explicatives sur votre programme.
⚠️ Les erreurs à éviter :
● Ne laissez pas de fichier dépassé ou de gros morceaux de code
commentés ! Prenez le temps de nettoyer votre projet et de lui
donner un aspect professionnel.
● Le test complet de votre programme peut prendre du temps. Il est
important de vous assurer qu’il fonctionne à 100 % comme prévu.
Vous pouvez profiter de la construction `if __name__ == “__main__”`
pour exécuter indépendamment le code de vos modules.

Retour haut de page