Pacwoman : honneur aux femmes !
Second projet personnel réalisé en deuxième année. Le but était d’apprendre la Programmation Orientée Objet (POO). Le choix du sujet était assez libre. Ayant une forte affinité pour le rétrogaming et voulant mettre à l’honneur le côté féminin en informatique, j’ai donc décidé de créer mon propre jeu en faisant un éditeur de niveau type Miss Pacman. La charte graphique se base sur les couleurs de ce jeu : le rose, orange, et jaune.
Technologies choisies :
Voici les étapes principales effectuées dans le cadre de ce projet :
0. MVP et User stories
Il s’agit de l’étape préparatoire du fil rouge. J’ai du mettre en place les grandes lignes du projets en réalisant des diagrammes de cas d’usages, d’activité, pour ce début de projet. Il a fallu également définir le MVP (ici le fait de faire un éditeur de niveau), ainsi que les parties optionnelles à venir par la suite (MVP+) tel que la jouabilité. J’ai également fait les maquettes de mon éditeur de niveau sur Figma.
Compétences techniques
-> Proposer une application cohérente à une demande client
-> Documenter les objectifs d’une application
-> Documenter une procédure sous la forme d’un algorithme
Compétences associées
-> Comprendre et s’approprier une demande client
-> Réfléchir les développements à réaliser
-> Savoir spécifier et documenter une solution logiciel
Maquette de l'éditeur de niveau réalisée avec Figma
1. Classe
Pour cette étape il a fallu mettre en place l’environnement Java afin de pouvoir travailler sur le back-end. J’ai dû définir les différentes classes utiles en lien avec mes formes : rectangle pour les murs, le rond pour les billes à manger, les triangles pour les fantômes, et l’hexagone pour Pacwoman.
Compétences techniques
-> Création d’une architecture objet
Compétences associées
-> S’initier à la programmation orienté objet, connaître la notion d’objet, de classe, d’attribut et de méthode
2. Encapsulation
Durant cette phase, j’ai du mettre en place un système de getters et setters en fonction des attributs et méthodes de chacune des classes pour en protéger certaines données.
Compétences techniques
-> Création, destruction et modification d’instance de classes
Compétences associées
-> Comprendre l’encapsulation : la portée des variables et des méthodes ainsi que l’intérêt des getters et setters
3. Héritage
Une fois l’encapsulation effectué, j’ai dû regrouper mes classes en classe enfants reliées à une classe mère « Forme ». Il a fallu faire en sorte que les méthodes communes soient mises dans la classe mère afin de les transmettre aux enfants, et non plus mettre individuellement pour chaque classe le même type de méthode. Ex : calculer l’aire et le périmètre sera commun à chaque forme.
Compétences techniques
-> Création d’une classe mère et de classes héritées
Compétences associées
-> Comprendre l’intérêt de l’héritage : la hiérarchie de classe et la spécialisation
4. UML
Dans cette étape-ci, j’ai pu réaliser un diagramme de classe à l’aide de PlantUML. Cela m’a permis de modéliser l’architecture du back-end avec ce que j’avais mis en place précédemment à savoir : ma classe mère « Forme » et mes classes enfants « Rectangle », « Rond », « Triangle », « Hexagone ».
Compétences techniques
-> Modéliser l’architecture d’un projet avec UML
Compétences associées
-> Savoir réaliser et comprendre un diagramme UML
5. Composition et polymorphisme
Dans cette partie, j’ai dû faire en sorte de spécifier certaines méthodes de mes classes enfants. En effet, l’aire et le périmètre étant commun à toutes les classes de mes formes via la classe mère, il a fallu spécifier pour chacune de mes formes le bon périmètre ainsi que la bonne aire. Car toutes mes formes n’ont pas le même calcul pour ces deux composantes.
J’ai également dû mettre en place une classe composition « Labyrinthe » afin de pouvoir y mettre plusieurs formes, à savoir plusieurs rectangles, ronds, triangle et un hexagone.
Compétences techniques
-> Ajout et mobilisation de méthodes communes à plusieurs classes
Compétences associées
-> Rédiger une classe mobilisant les notions de composition
-> Comprendre la mécanique du polymorphisme et la mobiliser
6. Tests
La réalisation des tests s’est effectué uniquement sur la classe composition « Labyrinthe ». Il s’agissait de tests unitaires, visant à permettre de vérifier la robustesse du code. J’ai donc mis en place une série de tests sur la classe en question, notamment sur le calcul de l’aire et du périmètre.
Compétences techniques
-> Tester et valider le comportement d’une classe
Compétences associées
-> Comprendre l’intérêt des tests unitaires et savoir les mettre en œuvre
7. API
Dans cette étape, j’ai dû mettre en place un CRUD (Create : POST, Read : GET, Update : PUT, Delete : DELETE) afin de pouvoir communiquer par la suite avec le front-end lors de son implémentation. J’ai réaliser les tests API à l’aide de Swagger, ce qui m’a permis de vérifier que mes routes fonctionnaient correctement. J’ai également mis en place la gestion des erreurs HTTP 400/404.
Compétences techniques
-> Création et utilisation d’une API afin de partager des informations
Compétences associées
-> Maitriser le format d’échange de données JSON
-> Mise à disposition d’informations sous forme de JSON
-> Considérer l’importance de la sobriété des données
-> Tester et documenter une API à l’aide d’outils dédiés
8. ORM
Afin de pouvoir communiquer avec la base de données, j’ai dû mettre en place ce que l’on appelle un ORM. Cela m’a permis de créer ma base données en mettant en place un repository et des entity afin de construire les tables.
Compétences techniques
-> Utilisation d’un ORM pour la sauvegarde en BDD
Compétences associées
-> Savoir interagir avec une base de données pour sauvegarder et lire des informations à l’aide d’un ORM
9. Déploiement
Dans cette phase, le but était de pouvoir accéder au back à partir d’un autre serveur. Pour cela, j’ai mis mon projet sous Docker, afin d’effectuer un déploiement sur un serveur local.
Compétences techniques
-> Déployer une api et une base de donnée sur un serveur
Compétences associées
-> Maitriser les commandes de base pour piloter un serveur
-> Déployer et administrer une architecture n-tiers basée sur des APIs REST
-> Documenter le déploiement d’une solution
-> Adapter une application pour qu’elle fonctionne sur un serveur déjà mobilisé par d’autres services
10. Front
Dans le projet, il s’agit d’une partie conséquente. Jusqu’alors, le back était la seule chose en place, sans avoir de rendu côté utilisateur. Dans cette étape, j’ai mis en place l’interface en question en utilisant le framework React en utilisant TypeScript. Le front-end a également mis sous Docker.
Compétences techniques
-> Création d’un site web dédié à la mise en forme d’informations issues d’une API, avec un framework
Compétences associées
-> Utilisation d’un framework web pour générer l’IHM d’un site web
-> Mise en oeuvre d’un front-end au sein d’une architecture N-tiers
-> Savoir limiter les données communiquées entre front-end et back-end au minimum nécessaire pour l’application
-> Appliquer les principes de l’éco-conception du code: optimisation des algorithmes, limitation d’appels aux serveurs…
11. CMS et SEO
Dans cette étape, il s’agit de créer son portfolio à l’aide de WordPress. J’ai dû travailler aussi la partie référencement afin d’optimiser les possibilités sur les moteurs de recherches d’accéder à mon site.
Compétences techniques
-> Déployer un site web pour optimiser le référencement de l’application déployée
Compétences associées
-> Mobiliser un CSM
Etre attentif au référencement d’un site web
12. Soutenance
Deux types de soutenances ont été réalisées lors de cette étape. Lors de la première, j’ai présenté un concept vu dans le fil rouge à savoir le principe de l’héritage et des interfaces. La seconde soutenance a consisté à réaliser une présentation du fil rouge en se focalisant sur une thématique précise. Dans mon cas la phase de test effectué sur la composition Labyrinthe.
Compétences techniques
-> Présentation synthétique des développement fait d’un point de vue technique et des fonctionnalités existantes
Compétences associées
-> Savoir présenter oralement un travail réalisé
-> Être en mesure de définir ce qui est essentiel de montrer pour la compréhension
-> Préparer un oral pour maintenir des contraintes de temps
13. Optionnel : mise en place d’un design pattern (ici Flyweight)
Afin d’optimiser le code et l’utilisation de l’application, j’ai mis en place un design pattern Flyweight. Il permet de réduire l’utilisation mémoire en partageant des objets identiques (état intrinsèque) au lieu d’en créer de nouveaux pour chaque occurence. L’état variable (état extrinsèque) est passé au moment de l’utilisation. Il repose sur une usine/factory qui retourne une instance partagée si elle existe, sinon la crée et la stocke. Cela permet, par exemple, de réutiliser des modèles identiques pour des formes plutôt que d’enregistrer des doublons en base de données.
Compétences techniques
-> Utilisation d’un design pattern pour facilitée l’évolution / le développement d’une fonctionnalité
Compétences associées
-> Comprendre l’intérêt des designs patterns dans un contexte de développement logiciel
-> Savoir sélectionner le pattern permettant de répondre à une problématique spécifique
-> Être capable d’adapter le pattern pour le mettre en œuvre dans le contexte propre à une une application
Ce que j’en ai tiré : j’ai appris énormément de choses dans ce projet individuel, notamment côté back-end. J’ai eu un vrai coup de cœur pour Java, mais aussi pour React côté front. Cela m’a permis d’acquérir des bases solides dans la POO. J’ai également mis le design pattern Flyweight en place afin d’optimiser le code. De façon générale, j’ai eu un réel plaisir à pouvoir mettre en forme mon propre jeu vidéo, qui sera à terme jouable