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:03] – [Intervention] jcheronsio:bloc2:2a:td0 [2026/08/26 10:31] (Version actuelle) – jcheron
Ligne 272: Ligne 272:
 ---- ----
  
-==== 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.1787306620.txt.gz
  • Dernière modification : il y a 2 mois
  • de jcheron