Gestion de vaisseaux

Description du contexte

Une compagnie de fret spatial FAR★STAR propose du transport de marchandises dans la galaxie. La compagnie possède principalement deux catégories de vaisseaux:

  • des vaisseaux de transport
  • des vaisseaux de combat

Combat

Les vaisseaux de combat peuvent s’équiper d'armes de combats spatiaux.

Il y a deux types d'armes: les phasers qui sont des armes qui envoient des photons à haute énergie (PHoton mASER) et les blasters (appelés aussi cannons à plasma) qui envoient des particules de gaz fortement ionisées.

Les vaisseaux de combats légers ne peuvent équiper que des phasers. Les vaisseaux de combats lourds peuvent équiper des phasers et des blasters.

Les armes équipées sont connectées au système d'alimentation énergétique du vaisseau. Toutefois, les blasters nécessitent d’être chargés en gaz. On peut donc connaitre le niveau de gaz de chaque blaster (en pourcentage) et les recharger.

Chaque vaisseau de combat à un nombre maximal d'arme qu'il peut équiper.

Transport

Les vaisseaux de transport peuvent transporter dans leurs soutes des containers, mais aussi des armes et des vaisseaux plus petits qu'eux.

Le transport d'objets est contraint par deux caractéristiques principales: le volume et la masse.

Le volume et la masse d'un container sont spécifiques à chacun d'eux (même si les dimensions sont standardisées). Le volume et la masse d'une arme sont spécifiques à chaque type d'arme. Le volume des vaisseaux est spécifique à chaque vaisseau, toutefois la masse est plus variable:

La masse des vaisseaux de combat correspond à la masse du vaisseau non armé, plus la masse de chacune des armes équipées. La masse d'un vaisseau de transport correspond à la masse à vide du vaisseau plus la masse de chacune des choses transportés dans la soute.

La capacité maximale de transport d'un vaisseau est limitée et dépend du type de vaisseau et de modifications spécifiques à chaque vaisseau. Il y a deux limites à la capacité d'un vaisseau de transport: une pour la masse et une pour le volume. La somme des masses des choses transportées ne peut pas dépasser la capacité massique maximale du vaisseau. La somme des volumes des choses transportées ne peut pas dépasser la capacité volumique maximale du vaisseau.

Notons que le volume d'un vaisseau de transport est toujours plus grande que sa capacité volumique.

Dans certains rares cas, des vaisseaux de transports hybrides permettent à la fois de transporter du matériel et de combattre. Il s'agit souvent de modèles anciens; la norme actuelle lors du transport dans des zones spatiales infestées de pirates de l'espâââce est de faire escorter des vaisseaux dédiés au transport par des vaisseaux dédiés au combat.

Objectif et travail à réaliser

L'objectif est d'analyser, concevoir et implémenter la composante d'un programme permettant de gérer les vaisseaux de la compagnie FAR★STAR.

Vous devez développer une API permettant de réaliser les opérations suivantes:

  • équiper/déséquiper un arme à un vaisseau de combat
  • charger/décharger des choses de la soute d'un vaisseau de transport
  • localiser chaque équipement de la compagnie et chaque pièce de fret
  • connaitre les caractéristiques des équipements et des pièces de fret

Ces opérations doivent s'assurer que les règles métier (par exemple la gestion de la capacité des vaisseaux) et de bon sens (par exemple qu'une arme ne pas être équipée par deux vaisseaux à la fois) soient respectées.

Vous devez offrir au programmeur une API simple et suffisante pour réaliser par exemple le scénario suivant

  • soit un vaisseau de combat léger VC-1 (volume=10, masse=50, 2 armes max)
  • on équipe VC-1 avec deux phasers (volume=1, masse=1)
  • soit un vaisseau de transport VT-2 (volume=100, masse=100, cap_volume=90, cap_masse=300)
  • on charge VT-2 avec 5 conteneurs (volume=1, masse=1)
  • on charge VT-2 avec VC-1
  • on déséquipe un des phasers de VC-1 et on le charge dans VT-2 comme du fret
  • soit MR-63 un vieux modèle de vaisseau de transport lourd capable de se battre (volume=200, masse=150, cap_volume=180, cap_masse=600, 5 armes max)
  • on équipe MR-63 avec deux blasters (volume=2, masse=2, gaz=50%), deux phasers (volume=1, masse=1)
  • on charge MR-63 avec le vaisseau VT-2, et 4 conteneurs (volume=10, masse=100)
  • on veut savoir quelle est la masse totale de MR-63 (un bon gros 713) et quel est le volume disponible dans MR-63 (il en reste pour 40)
  • on veut savoir où est chacun des phasers (deux sont dans MR-63, un est dans la soute de VT-2, le dernier est équipé par VC-1 qui est dans la soute de VT-2)
  • on veut connaitre le niveau de gaz des blasters équipés par MR-63, puis les recharger

Réalisation et remise

Le travail peut être réalisé par groupe de deux.

Langage de programmation

Le programme doit être réalisé dans trois langages à objet différents, à choisir dans les catégories suivantes:

  • Python ou Ruby (ou un autre langage à typage dynamique sous approbation du professeur)
  • Java ou C# (ou un autre langage à typage statique à héritage simple sous approbation du professeur)
  • Nit, Scala ou C++ (ou un autre langage à typage statique à héritage multiple sous approbation du professeur)

Code et documentation

Vous devez réaliser et remettre:

  • 3 diagrammes UML (un par programme)
  • un document de 3 pages maximum expliquant:
    • la conception générale (indépendante des langages), et sa justification
    • les différences de conception de chacun des 3 programmes, et leurs justifications
    • les points forts et faibles de chacun des 3 langages qui ont aidé ou gêné la réalisation du programme
  • le code source de chacun des 3 programmes
  • 3 programmes d'exemple traduisant le scénario de la section précédente en utilisant votre API

Évaluation

Seront pris en compte dans la notation:

  • La qualité de la modélisation proposée
  • La bonne utilisation des technologies objets et leur justification
  • La qualité du code

Modalités de remise

  • date: mardi 14 février
  • les documents demandés et le code, imprimés sur papier et agrafés
  • les documents demandés et le code sous forme électronique (dans une archive .zip ou .tar.gz)