sio:bloc2:2a:td0

Ceci est une ancienne révision du document !


TD0 : Révisions

Diagramme de classes - Gestion de caserne de pompiers (V1)Pompiernom: Stringprenom: Stringmatricule: Stringgrade: StringanneesService: intdisponible: booleanPompier()Pompier(nom: String, prenom: String, matricule: String)Pompier(nom: String, prenom: String, matricule: String, grade: String, anneesService: int)getNom(): StringgetPrenom(): StringgetMatricule(): StringgetGrade(): StringgetAnneesService(): intisDisponible(): booleansetGrade(grade: String): voidsetAnneesService(anneesService: int): voidsetMatricule(matricule: String): voidaugmenterAnciennete(): voidaugmenterAnciennete(nbAnnees: int): voidaugmenterAnciennete(nbAnnees: int, promotion: boolean): voidtoString(): StringCasernenomCaserne: Stringpompiers: List<Pompier>Caserne(nomCaserne: String)ajouterPompier(p: Pompier): voidnombrePompiersDisponibles(): intafficherEffectif(): voidrechercherParMatricule(matricule: String): PompierAgrégation : le Pompier existe indépendamment de la Caserne(pas de dépendance dans le constructeur).10..*

Diagramme de classes - Gestion de caserne de pompiers (V2)TypeSinistreINCENDIEACCIDENTINONDATIONFUITE_GAZSAUVETAGENiveauGraviteFAIBLEMODEREELEVECRITIQUEPompiernom: Stringprenom: Stringmatricule: Stringgrade: StringanneesService: intdisponible: booleanPompier()Pompier(nom: String, prenom: String, matricule: String)Pompier(nom: String, prenom: String, matricule: String, grade: String, anneesService: int)getNom(): StringgetPrenom(): StringgetMatricule(): StringgetGrade(): StringgetAnneesService(): intisDisponible(): booleansetGrade(grade: String): voidsetAnneesService(anneesService: int): voidsetDisponible(disponible: boolean): voidaugmenterAnciennete(): voidaugmenterAnciennete(nbAnnees: int): voidaugmenterAnciennete(nbAnnees: int, promotion: boolean): voidafficherFiche(): voidtoString(): StringCasernenomCaserne: Stringpompiers: List<Pompier>Caserne(nomCaserne: String)ajouterPompier(p: Pompier): voidretirerPompier(matricule: String): voidnombrePompiersDisponibles(): intafficherEffectif(): voidrechercherParMatricule(matricule: String): PompierLocationadresse: Stringville: StringcodePostal: Stringlatitude: doublelongitude: doubleLocation(adresse: String, ville: String)Location(adresse: String, ville: String, codePostal: String)getAdresse(): StringgetVille(): StringgetCodePostal(): StringgetLatitude(): doublegetLongitude(): doubletoString(): StringSinistretype: TypeSinistreniveauGravite: NiveauGravitedateDeclaration: LocalDateTimelocation: LocationSinistre(type: TypeSinistre, niveauGravite: NiveauGravite, location: Location)getType(): TypeSinistregetNiveauGravite(): NiveauGravitegetDateDeclaration(): LocalDateTimegetLocation(): LocationtoString(): StringInterventiondateDebut: LocalDateTimedateFin: LocalDateTimesinistre: SinistrepompiersMobilises: List<Pompier>Intervention(sinistre: Sinistre)ajouterPompier(p: Pompier): voidterminerIntervention(): voiddureeIntervention(): longafficherRapport(): voidAgrégation : le Pompier existe indépendamment de la Caserne(pas de dépendance dans le constructeur).10..*Composition : la Location n'a de sensqu'à travers le Sinistre.111111Agrégation : le Sinistre peut existeravant qu'une intervention soit déclenchée.11Agrégation : les pompiers mobilisésexistent indépendamment de l'intervention.10..*

Constructeurs

  • Location(adresse, ville) : constructeur simplifié, codePostal initialisé à ““, latitude/longitude à 0.0.
  • Location(adresse, ville, codePostal) : constructeur complet (sans coordonnées GPS pour rester simple).

Getters

Un par attribut (getAdresse(), getVille(), getCodePostal(), getLatitude(), getLongitude()). Pas de setters : une fois créée, une localisation ne change pas (immutabilité à discuter avec vos étudiants — bon lien avec l'encapsulation).

toString()

Retourne une chaîne lisible, ex : “12 rue des Lilas, 75001 Paris”.


Constructeur

  • Sinistre(type, niveauGravite, location) : initialise dateDeclaration automatiquement à LocalDateTime.now() (l'étudiant ne la passe pas en paramètre — bonne occasion de montrer qu'un constructeur peut faire des choses en plus de l'affectation directe).

Getters

  • getType(), getNiveauGravite(), getDateDeclaration(), getLocation().

Pas de setters : un sinistre déclaré ne change pas de nature (à débattre si vos étudiants trouvent un cas métier où la gravité doit être réévaluée en cours de route).

toString()

Doit afficher une synthèse : type, gravité, date, localisation. Ex :

[INCENDIE] Gravité : ELEVE - déclaré le 21/08/2026 à 10:32 - 12 rue des Lilas, Paris


Constructeur

  • Intervention(sinistre) : initialise dateDebut à LocalDateTime.now(), dateFin à null, pompiersMobilises à une liste vide.

ajouterPompier(Pompier p): void

Ajoute un pompier à la liste pompiersMobilises, mais uniquement s'il est disponible (p.isDisponible()). Si non disponible, afficher un message d'erreur (ou lever une exception si vous voulez aller plus loin). Une fois ajouté, on peut aussi le passer à disponible = false — bonne occasion de discuter de la cohérence entre objets liés.

terminerIntervention(): void

  • Fixe dateFin à LocalDateTime.now().
  • Repasse chaque pompier de pompiersMobilises à disponible = true.
  • Éventuellement afficher un message de confirmation.

dureeIntervention(): long

Calcule la durée en minutes entre dateDebut et dateFin (utiliser Duration.between(…).toMinutes()). Si dateFin == null, on peut soit calculer par rapport à LocalDateTime.now() (intervention en cours), soit renvoyer -1 ou lever une exception — bon point de discussion sur la gestion des cas limites.

afficherRapport(): void

Affiche une synthèse complète de l'intervention : sinistre concerné, dates début/fin, durée, liste des pompiers mobilisés (nom, prénom, matricule). Bonne méthode pour manipuler la liste (for ou forEach) et enchaîner les appels toString().


  • Cohérence disponibilité pompier ↔ intervention : si un pompier est mobilisé, il ne devrait pas pouvoir être ajouté à une deuxième intervention en même temps. C'est ajouterPompier qui doit porter cette règle métier (pas juste l'ajout brut à la liste) — bon exemple de logique métier encapsulée dans une méthode plutôt que laissée à l'appelant.
  • dateFin nullable : premier contact avec la gestion d'un état “optionnel”/“pas encore renseigné”. Peut aussi ouvrir une discussion sur Optional<LocalDateTime> si vous voulez aller plus loin (probablement hors scope 2 SIO à ce stade).
  • Immutabilité de Location et Sinistre : contraste intéressant avec Pompier qui a des setters. Bonne question à poser en classe : “Pourquoi ces classes n'ont pas de setters, à votre avis ?”
  • sio/bloc2/2a/td0.1787306437.txt.gz
  • Dernière modification : il y a 2 mois
  • de jcheron