%% nav-debut : généré par gen_navigation.py, ne pas modifier à la main %%
> [!nav]
> ↩ [[Code et Développement/Développement d'Applications/Modélisation Jeu Vidéo/Modélisation Jeu Vidéo|Accueil · Modélisation Jeu Vidéo]]
%% nav-fin %%
# 🟧 1. Introduction
La **Programmation Orientée Objet (POO)** permet de structurer un programme autour d’**objets** qui représentent des éléments du monde réel. Elle apporte :
- une meilleure **organisation** du code
- une **représentation naturelle** des systèmes complexes
- une **modularité** favorisant la réutilisation
- une **maintenance** plus simple
- une **évolution** facilitée des applications
La POO aide à décomposer un problème en entités autonomes capables d’interagir.
## 🎨 UML et le diagramme de classes
**UML (Unified Modeling Language)** est un langage graphique permettant de **modéliser** :
- les données (attributs),
- les traitements (méthodes),
- les relations entre objets,
- la structure d’un programme.
Dans cette compétence, nous utilisons principalement le **diagramme de classes UML**, qui sert à représenter :
- les classes d’un programme
- leurs attributs / méthodes
- la manière dont elles **collaborent**
🎯 **Objectifs du diagramme de classes :**
- Construire un schéma **compréhensible par tous** (enseignants, étudiants, développeurs)
- Concevoir la structure d’un programme **avant** d’écrire la moindre ligne de code
- Raisonner sur l’architecture **sans les contraintes** du langage de programmation
# 🟦 2. Objet : identité, état
Un **objet** est une entité autonome possédant :
- une **identité** (ce qui le distingue des autres objets)
- un **état** (les valeurs de ses attributs)
![[Code et Développement/Développement d'Applications/Modélisation Jeu Vidéo/ressources/Capture d’écran 2025-11-22 à 14.05.16.png]]
# 🟩 3. Classe : modèle des objets
Lorsque plusieurs objets partagent les mêmes caractéristiques, ils sont regroupés dans une **classe**.
Une **classe** est un modèle, un moule permettant de créer des objets ayant :
- les mêmes **attributs**
- les mêmes **méthodes** (comportements)
![[Code et Développement/Développement d'Applications/Modélisation Jeu Vidéo/ressources/Capture d’écran 2025-11-22 à 14.10.52.png]]
Une classe :
- porte un **nom**
- définit les **attributs**
- définit les **méthodes**
Les méthodes sont de deux types :
- **accesseurs** → permettent de lire l’état (ex. : *deQuellePuissance()*)
- **modifieurs** → permettent de modifier l’état (ex. : *accelerer()*, *demarrer()*)
> Un objet est une **instance** de la classe.
# 🟫 4. Instanciation
L’**instanciation** consiste à créer un objet à partir d’une classe.
![[Code et Développement/Développement d'Applications/Modélisation Jeu Vidéo/ressources/Capture d’écran 2025-11-22 à 14.12.58.png]]
Exemple : l’objet `maClio` est une instance de la classe *Voiture* et possède ses propres valeurs d’attributs.
![[Code et Développement/Développement d'Applications/Modélisation Jeu Vidéo/ressources/Capture d’écran 2025-11-22 à 14.17.03.png]]
Chaque objet issu d’une classe possède son **propre état**, même si tous ont la même structure.
# 🟪 5. Relations entre classes
Une **association** est un lien entre deux classes.
Elle traduit une collaboration, une utilisation ou une dépendance entre objets.
![[Code et Développement/Développement d'Applications/Modélisation Jeu Vidéo/ressources/Capture d’écran 2025-11-22 à 14.21.24.png]]
> [!tip] Représentation UML
> Une ligne entre deux classes = une **association**
## 🔢 Cardinalités
Les **cardinalités** indiquent combien d’objets peuvent être reliés entre eux.
- Valeur unique : `1`, `3`, `10`
- Intervalle : `1..3`, `2..*`, `1..17`
- Symbole `*` = « autant qu’il faut » (équivalent à +∞)
Si aucune cardinalité n’est indiquée, la valeur **par défaut est 1**.
![[Code et Développement/Développement d'Applications/Modélisation Jeu Vidéo/ressources/Capture d’écran 2025-11-22 à 14.24.06.png]]
> [!tip] Lecture UML
> Une *Voiture* appartient à **0 ou 1** *Personne*
> Une *Personne* possède **0 à +∞** *Voitures*
## 🧰 Composition & Agrégation
La **composition** et l’**agrégation** sont des formes particulières d’association exprimant une relation “contenu / contenant”.
### 🔶 Composition
Le contenu **n’existe pas sans** le contenant.
![[Code et Développement/Développement d'Applications/Modélisation Jeu Vidéo/ressources/Capture d’écran 2025-11-22 à 14.26.17.png]]
> [!tip] UML
> Losange **plein** → *composition*
> Si la Voiture disparait, son Chassis disparait aussi.
### 🔷 Agrégation
Le contenu peut exister **indépendamment** du contenant.
![[Code et Développement/Développement d'Applications/Modélisation Jeu Vidéo/ressources/Capture d’écran 2025-11-22 à 14.27.46.png]]
> [!tip] UML
> Losange **vide** → *agrégation*
> Une Voiture détruite n’empêche pas les Roues de continuer d’exister.
## 🟦 Classe-association
Une association peut aussi porter des informations propres.
![[Code et Développement/Développement d'Applications/Modélisation Jeu Vidéo/ressources/Capture d’écran 2025-11-22 à 14.29.04.png]]
> [!tip] UML
> Une *classe-association* possède ses propres attributs et méthodes.
# 🟧 6. Héritage
L’**héritage** permet de construire une classe à partir d’une autre en réutilisant ses attributs et méthodes.
### Intérêts :
- **Spécialisation** → enrichir ou modifier le comportement
- **Réutilisation** → éviter la duplication de code
- **Organisation** → hiérarchiser les concepts
Exemples :
- Un *VéhiculePrioritaire* est une *Voiture* avec un gyrophare
- Une *VoitureElectrique* est une *Voiture* dont le démarrage est différent
![[Code et Développement/Développement d'Applications/Modélisation Jeu Vidéo/ressources/Capture d’écran 2025-11-22 à 14.32.04.png]]
> [!tip] UML
> Une flèche va de la **sous-classe** vers la **super-classe**
L’objet `VehiculePrioritaire` :
- hérite des attributs et méthodes de *Voiture*
- ajoute ses propres comportements (ex. `allumerGyrophare()`)
![[Code et Développement/Développement d'Applications/Modélisation Jeu Vidéo/ressources/Capture d’écran 2025-11-22 à 14.33.33.png]]
On peut dire que :
- *VéhiculePrioritaire* **hérite** de *Voiture*
- *Voiture* = **classe mère / super-classe**
- *VéhiculePrioritaire* = **classe fille / sous-classe**
### Attention aux implications
![[Code et Développement/Développement d'Applications/Modélisation Jeu Vidéo/ressources/Capture d’écran 2025-11-22 à 14.34.30.png]]
> [!tip] UML
> *Voiture* est la Super-classe
> *VéhiculePrioritaire* est la Sous-classe
- Tout *VéhiculePrioritaire* **est une** *Voiture*
- Mais toute *Voiture* **n’est pas** un *VéhiculePrioritaire*
L’héritage permet de :
- **généraliser** → créer des classes plus abstraites
- **spécialiser** → ajouter des particularités
# 🎯 Conclusion
Cette partie du cours permet de :
- comprendre les fondements de la programmation orientée objet
- lire et construire un **diagramme de classes UML complet**
- identifier les classes, leurs attributs, leurs méthodes et leurs relations
- modéliser un système avant codage
%% nav-debut : généré par gen_navigation.py, ne pas modifier à la main %%
> [!nav]
> ↩ [[Code et Développement/Développement d'Applications/Modélisation Jeu Vidéo/Modélisation Jeu Vidéo|Accueil · Modélisation Jeu Vidéo]]
%% nav-fin %%
---
🗓️ Historique
Dernière mise à jour : `22 novembre 2025`
Rédigé par : [[Julien DUQUENNOY]]