Conception détaillée

1. Travail à réaliser

Objectif

Spécification détaillée des composants: leur structure (diagramme de classes de conception), ainsi que le comportement de chaque opération fournie par le composants. Le comportement peut-être décrit en utilisant les diagrammes d’activité, d’interaction, les machines d’état, ainsi que OCL.

Moyens

Appliquez les concepts vus en cours: design patterns, principes GRASP, bonnes pratiques, etc.

2. Réponses aux exigences non-fonctionnelles

2.1. Concurrence

Chaque partie sera instanciée sur son propre thread ce qui évitera les problèmes de concurrence lors des parties.

Cependant, lors de la création et choix de lobby, de nombreux joueurs peuvent essayer de se connecter à la même partie au même moment.
Pour éviter les problèmes de concurrence possible à ce moment là, nous utiliserons des méthodes starvation-free

Cela permet d’éviter un blocage par mauvaise connexion et des comportements non souhaités dans les lobby.

2.2. Performance

Pour obtenir les meilleures performances possibles, nous implémenter des algorithmes performants utilisant des structures de données adaptées.

Les parties en elles même étant peu demandantes en termes de requêtes, dû au nombre limité d’actions possibles et de joueurs par partie, nous utiliserons l’outil wait/notify pour éviter une surutilisation des threads.

Cependant, il faut également mettre en place, en amont, un système filtrant les requêtes souhaitées pour ne pas réveiller un thread sans que ce soit nécessaire.

2.3. Interopérabilité

La mise en place d’Interfaces entre les composantes du logiciel permet de ne pas se soucier de leur implémentation. Ainsi, il est possible de changer rapidement de support pour le jeu en adaptant une composante du logiciel au support souhaité.

De même, les standardiser les formats de données par l’intermédiaire de classes abstraites et interfaces permet de garantir une plus grande compatibilité entre les composants.

2.4. Portabilité

L’aspect modulaire du projet, de par ses structures de données abstraites, permet de facilement adapter les implémentations à d’autres supports.

Cependant, pour éviter des transition difficiles entre les langages, nous utiliserons le moins possible les bibliothèques spécifiques à un langage.

2.5. Sécurité

2.5.1. Exigence de sécurité

Notre système doit être sécurisé, même si nous ne manipulons pas des données sensibles. Pour cela nous devons vérifier l’identité de l’utilisateur.

N’ayant pas à nous occuper de l’authentification de l’utilisateur nous admettons que le système s’occupant de cela est correct et lui-même sécurisé. Nous admettons également que, quelle que soit la plateforme utilisée (web, logiciel, application) le service d’authentification sera le même pour tous.

2.6. Maintenabilité

Par souci de maintenabilité, nous avons défini une structure modulaire se basant sur une définition abstraite des composants.

Notre code suivra également des règles communes de nomenclature et syntaxe tout en étant commenté et documenté.

Enfin à chaque procédure sera associé une suite de texte permettant de vérifier son bon fonctionnement au fil des différentes versions du projet.

2.7. Interface utilisateur

l’interface utilisateur doit être stable, efficace et cross plateforme. Nous avons donc choisi d’en faire une interface web. Cela permet l’utilisation de protocoles sécurisés et une stabilité de fonctionnement sur les divers supports des utilisateurs.

2.8. Interface logicielle

L’interaction avec le logiciel doit être simple, rapide et sécurisée. Notre interface logiciel utilise des données claires, structurées et documentées et fournit des méthodes pour les manipulées.

2.9. Interface ou protocoles de communication

Nous avons choisi d’utiliser le websocket car il permet une sécurité accrue et des communications en temps réel.

Les composants logiciels peuvent interagir avec la base de données le feront par le biais de la JPA fourni par java.

2.10. Correction

Le projet est couplé à une suite de tests unitaires permettant de s’assurer du bon fonctionnement des différentes fonctions, méthodes et procédures.

3. Patrons logiciels utilisés

3.1. Patron de conception "Facade"

Au vu des contraintes évoqués en amont, le projet sera implémenté selon le patron de conception facade. Chaque composant doit mettre à disposition une interface répondant aux critères communs. Les interactions entre les composants passent toutes par ces interfaces.

3.2. Patron architectural "Layer"

Le logiciel suit une architecture "layer" ou chaque composant ne connait et peut communiquer qu’avec ceux directement adjacent. Le fonctionnement profond de l’application est donc indépendant des couches supérieures et réciproquement.

4. Choix techniques - Distribution des processus

Le système est réparti en trois processus principaux:

  • L’interface utilisateur
    → Sous forme de page web dont la gestion est laissée à un programme angular. Angular propose une interface interactive tout en se basant sur des langage commun tel que css et html, ce qui facilite son utilisation et sa maintenance.

  • Application
    → C’est le programme principal. Il reçoit et distribut les informations. Il est développé en Java Spring Boot. Il crée et transmet les informations aux threads des parties.

  • La base de données
    → Sa base sur la JPA pour proposer une base de données efficace et des interfaces simplifiant son utilisation.