sio:bloc2:2a:td0

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
sio:bloc2:2a:td0 [2026/08/21 12:01] – [Location] jcheronsio:bloc2:2a:td0 [2026/08/26 10:31] (Version actuelle) – jcheron
Ligne 230: Ligne 230:
 === Constructeur === === 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).+  * ''Sinistre(type, niveauGravite, location)'' : initialise ''dateDeclaration'' automatiquement à LocalDateTime.now().
  
 === Getters === === Getters ===
Ligne 236: Ligne 236:
   * ''getType()'', ''getNiveauGravite()'', ''getDateDeclaration()'', ''getLocation()''.   * ''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).+Pas de setters : un sinistre déclaré ne change pas de nature.
  
 === toString() === === toString() ===
Ligne 254: Ligne 254:
 === ajouterPompier(Pompier p): void === === 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.+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.
  
 === terminerIntervention(): void === === terminerIntervention(): void ===
Ligne 264: Ligne 264:
 === dureeIntervention(): long === === 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.+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.
  
 === afficherRapport(): void === === 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().+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).
  
 ---- ----
  
-==== Points de vigilance ====+==== Héritage ====
  
-  * **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. +<html><div class="imageB"></html> 
-  * **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). +<uml> 
-  * **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 ?"+@startuml 
 + 
 +title Diagramme de classes - Gestion de caserne de pompiers (V3) 
 + 
 +abstract class Pompier { 
 +  - matricule: String 
 +  - nom: String 
 +  - prenom: String 
 +  - grade: String 
 +  - disponible: boolean 
 +  -- 
 +  + Pompier(matricule: String, nom: String, prenom: String, grade: String) 
 +  -- 
 +  + isDisponible(): boolean 
 +  + setDisponible(disponible: boolean): void 
 +  + getMatricule(): String 
 +  + getNom(): String 
 +  + getPrenom(): String 
 +  + getGrade(): String 
 +  + toString(): String 
 +} 
 + 
 +class PompierProfessionnel { 
 +  - salaireBase: double 
 +  -- 
 +  + PompierProfessionnel(matricule: String, nom: String, prenom: String, grade: String, salaireBase: double) 
 +  -- 
 +  + getSalaireBase(): double 
 +} 
 + 
 +class PompierVolontaire { 
 +  - employeur: String 
 +  - heureDebutTravail: LocalTime 
 +  - heureFinTravail: LocalTime 
 +  - quotaHeuresMensuel: int 
 +  - heuresEffectueesMoisCourant: int 
 +  -- 
 +  + PompierVolontaire(matricule: String, nom: String, prenom: String, grade: String, employeur: String, heureDebutTravail: LocalTime, heureFinTravail: LocalTime, quotaHeuresMensuel: int) 
 +  -- 
 +  + isDisponible(): boolean 
 +  + ajouterHeuresIntervention(heures: int): void 
 +  - estEnHorairesTravail(): boolean 
 +  + getEmployeur(): String 
 +  + getHeuresEffectueesMoisCourant(): int 
 +} 
 + 
 +Pompier <|-- PompierProfessionnel 
 +Pompier <|-- PompierVolontaire 
 + 
 +class Caserne { 
 +  - nomCaserne: String 
 +  - pompiers: List<Pompier> 
 +  -- 
 +  + Caserne(nomCaserne: String) 
 +  -- 
 +  + ajouterPompier(p: Pompier): void 
 +  + nombrePompiersDisponibles(): int 
 +  + afficherEffectif(): void 
 +  + rechercherParMatricule(matricule: String): Pompier 
 +} 
 + 
 +Caserne "1" o-- "0..*" Pompier 
 + 
 +note on link 
 +  Agrégation : le Pompier existe indépendamment de la Caserne 
 +  (pas de dépendance dans le constructeur). 
 +end note 
 + 
 +@enduml 
 + 
 +</uml> 
 +<html></div></html> 
 + 
 +===== Evolutions ===== 
 + 
 +==== Encapsulation ==== 
 + 
 +  * Ajoutez à Pompier un attribut privé dateEmbauche: LocalDate, avec un getter getAnciennete(): int qui calcule le nombre d'années depuis dateEmbauche (pas de setter pour anciennete — elle ne doit jamais être stockée directement). 
 +  * Ajoutez une méthode distanceVers(autre: Location): double dans Location, utilisant la formule de distance euclidienne simplifiée sur latitude/longitude. Utilisez-la dans Caserne pour écrire une méthode casernePlusProche(sinistre: Sinistre): boolean (nécessite que Caserne ait elle-même une Location — à ajouter). 
 + 
 +==== Héritage ==== 
 +Ajoutez à PompierProfessionnel une redéfinition de méthode manquante : une méthode calculerSalaireMensuel(): double dans Pompier (retournant 0 par défaut ou étant abstraite), redéfinie dans : 
 + 
 +  * PompierProfessionnel → salaireBase + prime d'ancienneté (2% par année de service) 
 +  * PompierVolontaire → heuresEffectueesMoisCourant * tauxHoraire (il faudra ajouter tauxHoraire) 
 + 
 +Créer une classe Officier héritant de PompierProfessionnel avec : 
 +  * un attribut primeCommandement: double 
 +  * une redéfinition de calculerSalaireMensuel() qui appelle super.calculerSalaireMensuel() et ajoute la prime 
 +  * une redéfinition de toString() qui appelle super.toString() et ajoute la mention du grade d'officier 
 + 
 + 
 +Ajoutez à Pompier une méthode abstraite peutIntervenirSur(type: TypeSinistre): boolean. Chaque sous-classe la redéfinit : 
 + 
 +  * PompierProfessionnel → toujours true 
 +  * PompierVolontaire → true sauf pour FUITE_GAZ (compétence non acquise, à simuler par une contrainte simple) 
 +  * Officier → toujours true, et en plus logue dans la console qu'un officier prend le commandement 
 + 
 +Utilisez cette méthode dans Intervention.ajouterPompier() pour refuser l'ajout d'un pompier incompétent sur ce type de sinistre.
  • sio/bloc2/2a/td0.1787306485.txt.gz
  • Dernière modification : il y a 2 mois
  • de jcheron