Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
public:mco-2:paradigme_objet_et_modelisation_uml [2016/02/03 10:39] – fbrucker | public:mco-2:paradigme_objet_et_modelisation_uml [2016/02/11 22:13] (Version actuelle) – [Visibilité] edauce | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== Paradigme objet et modélisation UML ====== | ||
+ | Nous allons présenter rapidement les différents concepts de la conception/ | ||
+ | |||
+ | ===== Les objets et les classes ===== | ||
+ | |||
+ | 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 : [[https:// | ||
+ | |||
+ | < | ||
+ | Tout objet fait parti d'une classe. La classe la plus générale étant souvent la classe //Object//. | ||
+ | </ | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Les classes sont décrite avec leurs méthodes (ce qu'ils font) et attributs : | ||
+ | |||
+ | {{: | ||
+ | < | ||
+ | @startuml | ||
+ | title Chat | ||
+ | |||
+ | class Chat { | ||
+ | +bruit miaou() | ||
+ | } | ||
+ | @enduml | ||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | Pour les diagrammes UML, on utilisera [[http:// | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Notation & UML ==== | ||
+ | |||
+ | === Notations === | ||
+ | |||
+ | On écrira les noms en [[https:// | ||
+ | |||
+ | De plus : | ||
+ | * les classes commencent par une Majuscule, | ||
+ | * les objets commencent par une minuscule, | ||
+ | |||
+ | === UML === | ||
+ | |||
+ | * un objet est une boite dont le titre est **nomObjet : NomClasse** : ci-dessus //lolCat// est une instance de la classe //Chat//. | ||
+ | * les méthodes sont décrites par leur type de retour, leur nom et entre parenthèse leurs paramètres : ici la méthode //miaou// de la classe Chat ne prend pas de paramètre et rend un objet //bruit//. | ||
+ | |||
+ | ===== Relations entre les classes ===== | ||
+ | |||
+ | On voit bien que les différentes classes d' | ||
+ | |||
+ | Nous avons à notre disposition essentiellement deux façons de regrouper les classes : | ||
+ | * par ce qu' | ||
+ | * par ce qu' | ||
+ | |||
+ | ==== Ce qu'ils sont ==== | ||
+ | |||
+ | On regroupe les classes par les caractéristiques qu' | ||
+ | Avec l' | ||
+ | |||
+ | Avec nos animaux : | ||
+ | * ces classes sont des particularités d'un concept plus général : l'" | ||
+ | * ici, mais ce n'est pas toujours le cas, il n'y a pas vraiment d' | ||
+ | * la seule chose qui les relie c'est qu' | ||
+ | |||
+ | {{: | ||
+ | < | ||
+ | @startuml | ||
+ | title Animaux | ||
+ | |||
+ | abstract class Animal { | ||
+ | +void lol() | ||
+ | } | ||
+ | |||
+ | class Chat | ||
+ | class Chien | ||
+ | class Alpaga | ||
+ | |||
+ | Animal <|-down- Chat | ||
+ | Animal <|-down- Chien | ||
+ | Animal <|-down- Alpaga | ||
+ | |||
+ | @enduml | ||
+ | </ | ||
+ | |||
+ | === UML === | ||
+ | |||
+ | La relation d' | ||
+ | |||
+ | {{: | ||
+ | < | ||
+ | @startuml | ||
+ | |||
+ | class 4x4 | ||
+ | class Voiture | ||
+ | |||
+ | Voiture | ||
+ | |||
+ | @enduml | ||
+ | </ | ||
+ | |||
+ | ==== Ce qu'ils font ==== | ||
+ | |||
+ | 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 : | ||
+ | * mais pas de la même manière (l'un a des griffes, l' | ||
+ | * cela ne peut être une composante d' | ||
+ | * les faire hériter d'un ancêtre commun ayant des griffes n'est pas biologiquement pertinent. | ||
+ | |||
+ | {{: | ||
+ | < | ||
+ | @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' | ||
+ | |||
+ | === UML === | ||
+ | |||
+ | La relation d' | ||
+ | * "un trait pointillé avec une flèche en triangle vide", | ||
+ | * "un trait plein avec un rond vide" : utilisé pour rappeler un nom d' | ||
+ | |||
+ | {{: | ||
+ | < | ||
+ | @startuml | ||
+ | |||
+ | class 4x4 | ||
+ | class Scooter | ||
+ | |||
+ | interface SeGarerNimporteOù { | ||
+ | void surLeTrotoir() | ||
+ | void surUnPassageClouté() | ||
+ | } | ||
+ | |||
+ | SeGarerNimporteOù | ||
+ | |||
+ | Scooter --() SeGarerNimporteOù | ||
+ | @enduml | ||
+ | </ | ||
+ | |||
+ | ===== Attributs, méthodes et visibilité ===== | ||
+ | |||
+ | ==== Visibilité ==== | ||
+ | |||
+ | Les méthodes et attributs d'une classe peuvent avoir une visibilité limité : | ||
+ | * **public** : tout le monde peut voir et utiliser la méthode/ | ||
+ | * rond vert (plein pour les méthodes, vide pour les attributs) | ||
+ | * signe **+** | ||
+ | * **protégé** : la classe et ses descendants peuvent voir et utiliser la méthode/ | ||
+ | * losange orange (plein pour les méthodes, vide pour les attributs) | ||
+ | * signe **#** | ||
+ | * **privé** : uniquement la classe peut voir et utiliser la méthode/ | ||
+ | * carré rouge (plein pour les méthodes, vide pour les attributs) | ||
+ | * signe **-** | ||
+ | * **package** : les classes du package peuvent voir et utiliser la méthode/ | ||
+ | * triangle bleu (plein pour les méthodes, vide pour les attributs) | ||
+ | * signe **~** | ||
+ | |||
+ | 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' | ||
+ | |||
+ | {{: | ||
+ | < | ||
+ | @startuml | ||
+ | |||
+ | title Visibilité des attributs/ | ||
+ | |||
+ | 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 | ||
+ | </ | ||
+ | |||
+ | ==== Composition et agrégation ==== | ||
+ | |||
+ | 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' | ||
+ | |||
+ | {{: | ||
+ | < | ||
+ | @startuml | ||
+ | |||
+ | title Composition et agrégation | ||
+ | |||
+ | class Colors | ||
+ | class Card | ||
+ | class Deck | ||
+ | |||
+ | Card o-- Colors : agrégation | ||
+ | Card *-up- Deck : composition | ||
+ | |||
+ | @enduml | ||
+ | </ | ||
+ | |||
+ | ==== Méthodes de classes ==== | ||
+ | |||
+ | |||
+ | On **souligne** les méthodes et attributs de classes (mot clé " | ||
+ | |||
+ | Leur intérêt est (au moins) double : | ||
+ | * permet de créer des objets de la classe en question ([[https:// | ||
+ | * des méthodes d'une classe utilisée seulement pour regrouper des fonctions/ | ||
+ | |||
+ | Une [[https:// | ||
+ | |||
+ | ===== Pour aller plus loin en UML ===== | ||
+ | |||
+ | ==== Utilisation d'UML ==== | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | Utilisé un petit peu partout, lorsque l'on a besoin de catégoriser/ | ||
+ | * informatique, | ||
+ | * définition et gestion de projets, | ||
+ | * création de services, brainstorming, | ||
+ | * ... | ||
+ | |||
+ | 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. | ||
+ | |||
+ | ==== Divers ressources sur le net ==== | ||
+ | |||
+ | === Introduction et résumé === | ||
+ | |||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | |||
+ | === Série de cours === | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | |||
+ | === Études cas UML === | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// |