Nous allons présenter rapidement les différents concepts de la conception/modélisation Objet. Pour représenter ces concept, nous adopterons le formalisme UML (mais nous ne l'utiliserons que pour décrire des classes, quasiment jamais pour en représenter le fonctionnement complet du système).
On ne manipule que des choses réelles, pour nous des Objets. Nos programmes (ou processus, projet, données, etc) consisteront à créer des objets et les faire interagir ensemble. En revanche, ces objets vont être décrits par des classes qui regroupent leurs propriétés.
Exemple : des chats particuliers. Ce sont des instances (une réalisation concrète) de la classe Chat.
Les classes sont décrite avec leurs méthodes (ce qu'ils font) et attributs :
@startuml title Chat class Chat { +bruit miaou() } @enduml
On écrira les noms en CamelCase qui est une convention Java. Chaque langage a sa propre recommandation que l'on cherchera à respecter pour augmenter la lisibilité de son code.
De plus :
On voit bien que les différentes classes d'animaux comme les chats, les chiens voir même les alpagas partages des choses.
Nous avons à notre disposition essentiellement deux façons de regrouper les classes :
On regroupe les classes par les caractéristiques qu'elles partagent : héritage Avec l'héritage on regroupe les classe par concept de plus en plus général.
Avec nos animaux :
lol()
@startuml title Animaux abstract class Animal { +void lol() } class Chat class Chien class Alpaga Animal <|-down- Chat Animal <|-down- Chien Animal <|-down- Alpaga @enduml
La relation d'héritage est un "trait plein avec une flèche en triangle vide" :
@startuml class 4x4 class Voiture Voiture <|-left- 4x4 @enduml
Souvent plusieurs objets de natures très différentes font les même choses. Ces actions communes sont liées par une interface.
Ainsi, un chat et un goéland peuvent tous deux griffer :
@startuml title Interface class Animal interface Griffable { +outch griffer() } class Chat class Goéland Animal <|-down- Chat Animal <|-down- Goéland Animal <|-down- Escargot Griffable <|-up.. Chat Griffable <|-up.. Goéland @enduml
On dit qu'un objet implémente une interface s'il possède toute les méthodes de l'interface, ici une unique méthode griffer.
La relation d'implémentation d'interface peut être décrite de deux manières :
@startuml class 4x4 class Scooter interface SeGarerNimporteOù { void surLeTrotoir() void surUnPassageClouté() } SeGarerNimporteOù <|-down.. 4x4 Scooter --() SeGarerNimporteOù @enduml
Les méthodes et attributs d'une classe peuvent avoir une visibilité limité :
On essaiera dans la mesure du possible de protéger les attributs d'une classe pour qu'ils ne soient pas modifiés intempestivement (portée privé ou protected).
C'est le principe d'encapsulation qui permet (entre autre) de modifier la structure interne de la classe en ajoutant des fonctionnalités sans briser le reste du code (qui utilise des méthodes publiques inchangées).
@startuml title Visibilité des attributs/classes class Visibilité { +attribut: public; #attribut: protégé; -attribut: privé; ~attribut: package; +méthode: public(); #méthode protégée(); -méthode: privé(); ~méthode: package(); } @enduml
Les différents types sont souvent des objets de classes que l'on a créé nous même. Selon que l'on a crée l'objet ou ou qu'on le partage on parlera de composition ou d'agrégation respectivement. Ce lien vous explique bien les différentes possibilités.
@startuml title Composition et agrégation class Colors class Card class Deck Card o-- Colors : agrégation Card *-up- Deck : composition @enduml
On souligne les méthodes et attributs de classes (mot clé "static").
Leur intérêt est (au moins) double :
Une bonne explication pour le Java.
https://fr.wikipedia.org/wiki/UML_(informatique)
Utilisé un petit peu partout, lorsque l'on a besoin de catégoriser/regrouper des processus :
Très en vogue au début des années 2000, il est moins utilisé mais reste un bon outil de communication et de modélisation des données.