Notes de cours UML
==================

Introduction
------------

Nous devons voir les diagrammes :

- de cas d'utilisation
- d'interraction overview
- **de Class**
- **d'état**
- d'objet
- d'activitée
- de séquence

Modélisation logicielle
------------------------

un **modèle** est une représentation simplifiée d'une partie de la réalité dans un but spécifique.
Ces modèles ont pour "valeurs": 

- L'abstraction
- Compréhension
- Précision
- Prédictibilité
- Rentabilité

Dans tout les diagrammes uml, les commentaire sont encadrée et reliés avec des ligne discontinue

Diagramme de cas d'utilisation
------------------------------

Représente une "vitrine" du produit avec ces fonctions principales d'un point de vue utilisateurs.

Représente:

- Un système (carré entourant une partie du diagramme)
- Un ensemble de cas d'utilisation (dans un oval)
    - Accompagné d'une descriptin semi-structurée
    - Toujours lié à un acteur (sauf <\<include\>> et <\<exlude\>>)
- Les acteurs (bonnome batons)
- Les relations entre eux 

Attention de ne pas modéliser des dépendances causales ou séquentielles.

### Relations

- extension: ajoute un comportement supplémentaire à un point d'extension.
    - Dans le cas d'une condition, ajouter "[condition]" à la flèche
- inclusion: inclus dans le comportement d'un autre cas d'utilisation
- généralisation: remplace un cas d'u par un autre qui fournit plus de détails.
    - peut être entre cas d'u: spécialisation
    - peut être entre acteurs: héritage

![ATM Use Case diagram](./ATM_usecase.png "use case diagram")

Diagramme d'interaction
-----------------------

Permet de faire un diagramme d'activité avec les use case. C'est en quelques sorte un use case
diagramme séquentielle et causale.

Activity diagram
----------------

Permet de modéliser un comportement dynamique, une succession d'activités dans un système pour une
certaine tâche ainsi que son flux de controle.

Resemble à un diagramme d'état sans les états.

- activité: rectangle arrondi
- transitions: flèches
    - chaques activités doit avoir une transition sortante et peut avoir plusieurs transition
      entrante.
- Entrée: cèrcle noir
- Sortie: Cible
- Fin de flux: cercle baré
- Point de jonction/ Décision: losange
    - choix entre deux séquence mutuellement exclusive.
    - Condition notées en "[condition]"
    - sert à merge des chemins alternatifs (!pas chemins concurents)
- barre de synchronisation: ligne épaisse avec transition entrante et sortantes.
    - Un fork qui n'est pas join doit se terminer par un point de sortie (pour une terminaison de
      l'acitivité complète) ou par un symbole de fin de flux (dans le cas ou l'activité continue
      même sans cette branche).
- swimlanes: couloirs d'activité
- Objets: Rectangle
- Récurence: Sablier avec "[timeline]" pour spécifier la récurence
- Signal: Rectangle avec flèche et anti-flèche
- 
Il est possible de représenter des sous activitées en dessinant un diagramme d'activité dans un
rectangle.

![Activity Diagram](activity.png "activity")

Class diagram
-------------

Représente les structures statiques d'un système (classes, interfaces et leurs relations)

- Classes: Rectangle
    - Noun in PascalCase
    - Si interface, noté <\<interface\>>
    - Souligné si instance (et/ou :Type)
- Attributs: listées dans rectangle de classe
    - noun camelCase
    - peut avoir un type (primitif ou complexe)
    - peut avoir une valeur par défaut
    - une portée (class scope = souligné)
    - une liste de valeurs possibles (enum)
    - une visibilité (+, -, #, ~)
- Opérations: listées dans rectangle de classe
    - verb in camelCase
    - peut avoir un type de retour
    - peut avoir des arguments
    - une portée
    - une visibilité (+, -, #, ~)
    - Les getter & setter des attr ne sont généralement pas mentionnées.
- Associations: ligne
    - connexion bidirectionnelle entre classe
    - peut être accompagné en annonation du role de cette association (de part et d'autre)
    - peut être accompagné d'une quantification: m .. n avec * signifiant zero ou plus
    - peut être étiquetée par explicité ( works for |> )
    - peut être associé à elle même
    - Ajouter une croix à la base d'une association permet de la rendre uni-directionnelle 
- Gnéralisations: Flèche ouverte
- Contraintes: commentaire
    - "{or}" exclusion mutuelle
- Agrégation: diamand (<>--)
    - apartient-à ou est-une-partie-de ou est-composé-de
- Composition: diamand solide (<@>--)
    - agrégat mais avec dépendance forte (si l'agrégat est détruit alors ses parties aussi)

Sequence
--------

Décrire comment le programme doit se comporter. Comportement des diagrammes statiques.
La verticalitée représente le temps.

- Objets: Etiquette au dessus des lifeline (sous forme d'instance avec :)
    - Plusieurs instance = plusieurs rectangles superposés
- lifeline: ligne verticale
- Activation: boite sur la ligne de vie
- message: flèches entre les lignes de vies
- retour: flèche pointiée
- Création: objet au bout d'un message
- destruction: X en bas d'une ligne de vie
- Opérateurs: Rectangle d'une zone avec label
    - loop (while [...] do ...)
    - alt (if [...] then ... else ...)
    - opt (if [...] then ...)
    - break (if [...] then ... exit)
    - par (parallel)
    - neg (invalide)
    - critical (section critique)

D'autre diagrammes peuvent être utilisé à l'intérieur du diagramme de séquence

Stateshart
----------

Un stateshart décrit le comportement d'un système, d'une partie d'un système ou d'un objet

Resemble fortement à un activity diagram mais représente des états.

- Etat initial: Cercle noir
- Etat final: target
- State: rectangle arondi 
    - peut être un diagrame d'état lui même
- transition d'état : flèche avec condition de la transition
- actions: format: "event [guard] / action"
    - sur la flèche si lors de la transition
    - interne avec mots clés (events)
        - entry: lorsque le système entre dans un état
        - exit: lorsque le système sort d'un état
        - every x s / after x s: se déclenche selon l'évent
    - guard: Condition pour que la transition ai lieu
        - il vaut mieux etre détermiste (avoir des guard mutuelement exclusif)
- Transition composite: diamand (<>)
- etat historique: cercle avec H ou H*
    - mémorise le dernier état visité
    - Une transition peut en sortir dans le cas ou cet état n'aurais jammais été défini

Le stateshart est décrit dans un document.

```stateshart
interface <interface>

in event <name>
...

out event <name>
...


interface <interface2>

operation <name>(<parm>):<ret>

```
