<style> .reveal { font-size: 27px; } </style> # I-CH 326 UML Unified Modeling Language © Selmir Hajruli & EPSIC 2021 --- ## UML : Unified Modeling Language ![](https://i.imgur.com/5RZItHk.png) --- ## UML : Unified Modeling Language - **Langage graphique** de modelisation pour : - Specifier - Concevoir - Construire - Documenter des applications informatiques - **Synthèse** des bonnes pratiques de l’ingénierie informatique - **Unification** de modèles - **Standardisation** par l’OMG (Object Management Group) --- ## Objectif * Fournir un langage visuel et expressif<!-- .element: class="fragment fade-up fade-in-then-semi-out" --> * Fournir des mecanismes d’extension<!-- .element: class="fragment fade-up fade-in-then-semi-out" --> * Etre indépendant des technologies et langages<!-- .element: class="fragment fade-up fade-in-then-semi-out" --> * Fournir une baseformellepour la mod ́elisation<!-- .element: class="fragment fade-up fade-in-then-semi-out" --> --- ## Diagrammes * Diagrammes structurels (UML Structure) * Diagramme de classes (Class diagram)<!-- .element: class="fragment highlight-blue" --> * Diagramme d'objets (Object diagram) * Diagramme de composants (Component diagram) * Diagramme de déploiement (Deployment diagram) * Diagramme de paquetages (Package diagram) * Diagramme de structures (Composite structure diagram) * Diagrammes comportementaux (UML Behavior) * Diagramme de cas d'utilisation (Use case diagram)<!-- .element: class="fragment highlight-blue" --> * Diagramme d'activités (Activity diagram)<!-- .element: class="fragment highlight-blue" --> * Diagramme d'états-transitions (State machine diagram) * Diagrammes d'interaction (Interaction diagram) - Diagramme de séquence (Sequence diagram) - Diagramme de communication (Communication diagram) - Diagramme global d'interaction (Interaction overview diagram) - Diagramme de temps (Timing diagram) --- # Diagramme de use case > Le diagramme de cas d'utilisation représente la structure des grandes fonctionnalités nécessaires aux utilisateurs du système. C'est le premier diagramme du modèle UML, celui où s'assure la relation entre l'utilisateur et les objets que le système met en œuvre. ---- ## Diagramme de use case ![](https://i.imgur.com/G8VO5VC.png) ---- ## Introduction > Modèle construit en phase de définition des exigences fonctionnelles et enrichi pendant la phase d’analyse en utilisant d’autres diagrammes. * Objectifs : 1. Identifier les fonctionnalités du logiciel 2. En définir le périmètre 3. Identifier les éléments externes en interaction directe * Composé de : * Acteurs * Cas (d'utilisation) ---- ## Acteur * Rôle joue par une entité externe qui interagit avec le système * Il peut consulter et/ou modifier l’état du système * Comment les identifier ? * Utilisateurs humains * Systèmes connexes qui interagissent également avec le système * Comment les représenter ? ![](https://i.imgur.com/xVVgnBB.png) ---- ## Cas d'utilisation * Séquences d’actions réalisées par le système (résultat observable pour un acteur) * Comportement attendu (!= mode de réalisation) : - *ce que le* système devra faire - pas *comment* il le fera * Comment les identifier ? * Ensemble des cas utilisation == exigences fonctionnelles du système * Un cas == fonction métier selon le point de vue des acteurs * Commment les représenter ? ![](https://i.imgur.com/U0T2xq8.png =225x) ---- ## Exemple ![](https://i.imgur.com/YG4deOq.png) ---- ## Acteurs principaux et secondaires * Un acteur est qualifié de **principal** pour un cas d’utilisation lorsque ce cas rend service à cet acteur. * Les autres acteurs sont alors qualifiés de **secondaires**. * Un cas d’utilisation a au plus un acteur principal. * Le stéréotype ``<<primary>>`` vient orner l’association reliant un cas d’utilisation à son acteur principal. * Le stéréotype ``<<secondary>>`` est utilisé pour les acteurs secondaires ![](https://i.imgur.com/BeK3yPG.png) ---- ## Inclusion - Un cas A inclut un cas B si le comportement décrit par le cas A inclut le comportement du cas B. - Le cas A dépend de B. * Lorsque A est sollicité, B l'est obligatoirement, comme une partie de A. Cette dépendance est symbolisée par le stéréotype ``<<include>>`` * Exemple: l'accès aux informations d'un compte bancaire inclut nécessairement une phase d'authentification avec un identifiant et un mot de passe. ```plantuml left to right direction skinparam packageStyle rectangle (authentify) .> (get account infos) : include ``` ---- ## Extension * Un cas d'utilisation A étend un cas d'utilisation B lorsque le cas d'utilisation A peut être appelé au cours de l'exécution du cas d'utilisation B. * Exécuter B peut éventuellement entraîner l'exécution de A : contrairement à l'inclusion, l'extension est optionnelle. Cette dépendance est symbolisée par le stéréotype ``<<extend>>``. * Exemple : une banque la vérification du solde du compte n'intervient que si la demande de retrait dépasse 20 CHF. ```plantuml left to right direction skinparam packageStyle rectangle (vérification solde de compte) .> (retrait) : extends ``` ---- ## Généralisation * Un acteur **A** est une généralisation d’un acteur **B** si l’acteur **A** peut être substitué par l’acteur **B**. * Tous les cas d’utilisation accessibles à **A** le sont aussi à **B**, mais l’inverse n’est pas vrai. ![](https://i.imgur.com/Y9rmQnG.png) :::warning Attention ⚡: Le vocabulaire est trompeur par rapport à Java : il ne faut pas confondre «extension » et « généralisation » ::: ---- ## Exercice - Vétérinaire * Un vétérinaire veut créer une application informatique qui lui permettrait de gérer l’activité de son cabinet. * Il reçoit en consultation des animaux pour lesquels il établit, lors de la première visite, une fiche individuelle de renseignements. * Chaque consultation est enregistrée sur un journal chronologique des consultations et mentionnée sur la fiche de l’animal. * Les hospitalisations sont consignées dans un classeur particulier. * Lorsque quelqu’un amène un animal trouvé, le vétérinaire doit parfois rechercher le maître de l’animal en consultant le fichier National des animaux domestiques. ---- ## Exercice - Correction ![](https://i.imgur.com/0kw1o4s.png) ---- ## Exercice - Robot Motorisé - Via une télécommande fournie on peut effectuer sur le robot les actions suivantes : - Marche/Arrêt - Piloter - Reculer - Avancer - Tourner à droite - Tourner à gauche - Afficher l'image que lui transmets la caméra sur le robot - Modéliser le cas d'utilisation de la télécommande pour diriger le robot par un utilisateur. Note: Corrigé : ```csharp void Main() { var robot = new Robot(); var action = Console.ReadLine(); do { if (action == "s") robot.SwitchOnOff(); else Console.WriteLine(robot.Piloter(action)); action = Console.ReadLine(); } while (action != "q"); Console.WriteLine(robot.GetPosition()); } public class Robot { //private readonly int[,] _map = new int[10, 10]; private int _positionLatitude; private int _positionLongitude; private bool _state; public void SwitchOnOff() { _state = !_state; } public string Piloter(string direction) { if (_state == false) return "Robot éteint"; switch (direction) { case "a": if (_positionLatitude < 9) return $"{++_positionLatitude},{_positionLongitude}"; else return "Can't move"; case "r": if (_positionLatitude > 0) return $"{--_positionLatitude},{_positionLongitude}"; else return "Can't move"; case "d": if (_positionLongitude < 9) return $"{_positionLatitude},{++_positionLongitude}"; else return "Can't move"; case "g": if (_positionLongitude > 0) return $"{_positionLatitude},{--_positionLongitude}"; else return "Can't move"; default: return $"Invalid command {direction}"; } } public string GetPosition() => $"{_positionLatitude},{_positionLongitude}"; } ``` ---- ## Exercice - Correction ![](https://i.imgur.com/3rCsXHN.png =650x) ---- ## Exercice - Code2Diagram ```csharp public class Assurance { public void SaisirSinistre(decimal montant) { // bla bla saisie du sinistre if (montant > 1000) DemanderExpertise(); } private string DemanderExpertise() { return "EXPERTISE!"; } public decimal Rembourser() { decimal montantARembourser = 800; EnregistrerPaiement(montantARembourser); return montantARembourser; } private bool EnregistrerPaiement(decimal montant) => true; } ``` --- # Diagramme de classes > Le diagramme de classes (cf. section 3) est généralement considéré comme le plus important dans un développement orienté objet. Il représente l'architecture conceptuelle du système : il décrit les classes que le système utilise, ainsi que leurs liens, que ceux-ci représentent un emboîtage conceptuel (héritage) ou une relation organique (agrégation). ![](https://i.imgur.com/PGn44k2.png) ---- ## Introduction - Diagramme le plus important de la modélisation orientée objet - Fournit une représentation abstraite des objets du système qui vont interagir pour réaliser les cas d'utilisation - Il s'agit d'une vue statique, car on ne tient pas compte du facteur temporel dans le comportement du système - Chaque langage de Programmation orienté objet donne un moyen spécifique d'implémenter le paradigme objet (pointeurs ou pas, héritage multiple ou pas, etc.), mais le diagramme de classes permet de modéliser les classes du système et leurs relations indépendamment d'un langage de programmation particulier ---- ## Représentation graphique - Une classe est un classeur. Elle est représentée par un rectangle divisé en trois à cinq compartiments 1. Nom de classe 2. Attributs 3. Opérations (Méthodes) 4. (Responsabilités) Ensemble de tâches devant être assurées par la classe, mais pour lesquelles on ne dispose pas encore assez d'informations 5. (Exceptions) Situations exceptionnelles devant être gérées par la classe ![](https://i.imgur.com/NqSUumU.png) ---- ## Encapsulation, visibilité, interface - **Public** ou `+` Tout élément qui peut voir le conteneur peut voir l'élément indiqué. - **Protected** ou `#` Seul un élément situé dans le conteneur ou un de ses descendants peut voir l'élément indiqué. - **Private** ou `-` Seul un élément situé dans le conteneur peut voir l'élément. - **Package** ou `∼` Seul un élément déclaré dans le même paquetage peut voir l'élément. ![](https://i.imgur.com/y7gYNPv.png) ---- ## Conventions de style - *Italique* - Abstraite - `abstract` - <u>Souligné</u> - Statique - `static` - `<<leaf>>` - Finale - `sealed` - `const` - Constante - `const` ![](https://i.imgur.com/0vgInZD.png) Note: - `abstract` - En programmation orientée objet, une classe abstraite est une classe dont l'implémentation n'est pas complète et qui n'est pas instanciable. Elle sert de base à d'autres classes dérivées. - `static` - Une méthode statique ou méthode de classe, indépendante de toute instance de la classe (objet). - `sealed` - Il s'agit du mot-clé `sealed` qui peut-être appliqué soit à une classe ou bien à une méthode. Lorsque l'on définit une classe comme « finale », cela signifie qu'elle ne pourra plus être dérivée par une sous-classe. - `const` - Les constantes sont des champs dont les valeurs sont définies au moment de la compilation et ne sont pas modifiables. ---- ## Exercice 1 * *`-maMethode (param1:int) : void`* <!-- .element: class="fragment fade-up fade-in-then-semi-out" --> * Une méthode maMethode qui est abstraite (car en italique). Elle ne renvoie rien et accepte un argument : $param1, qui est un entier. Sans oublier sa visibilitée, symbolisée par le signe -, qui est privée.<!-- .element: class="fragment fade-up fade-in-then-semi-out" --> * `#maMethode (param1:string) : array` <!-- .element: class="fragment fade-up fade-in-then-semi-out" --> * Méthode maMethode ni abstraite, ni finale. Elle renvoie un tableau et accepte un argument : $param1, qui est une string. Sans oublier sa visibilitée, symbolisée par le signe #, qui est protégée.<!-- .element: class="fragment fade-up fade-in-then-semi-out" --> * `+<<leaf>> maMethode() : array`<!-- .element: class="fragment fade-up fade-in-then-semi-out" --> * Méthode finale (signalée par le mot leaf). Elle ne prend aucun argument et renvoie un tableau. Quant à sa visibilité, le signe + nous informe qu'elle est publique.<!-- .element: class="fragment fade-up fade-in-then-semi-out" --> ---- ## Interactions : Héritage ![](https://i.imgur.com/c7pkODF.png) ```csharp class Mere { protected int Aattribut1; protected string[] Attribut2; public void Methode() { } } class Fille : Mere { protected float Attribut3; public void Set(string nom, dynamic valeur) { } } ``` ---- ## Interactions : Interfaces ![](https://i.imgur.com/vxEfvAt.png) ```csharp interface IMaClasse { public int Methode1(); public int[] Methode2(); } class MaClasse : IMaClasse { protected string Attribut; public void Methode() { } // Ne pas oublier d'implémenter les méthodes de l'interface ! public int Methode1() { } public int[] Methode2() { } } ``` ---- ## Interactions : Associations ![](https://i.imgur.com/UCiDa2y.png) - On dit que deux classes sont associées lorsqu'une instance des deux classes est amenée à interagir avec l'autre instance - L'association est ici caractérisée par le fait qu'une méthode de la classe `NewsManager` entre en relation avec une instance de la classe `News` - Le mot écrit au centre, au-dessus de la ligne est la définition de la relation. Il est suivi d'un petit symbole indiquant le sens de l'association. Ainsi, on peut lire facilement « `NewsManager` gère `News` ». - Cardinalités * **x** (nombre entier) : tout simplement la valeur exacte de **x**. * **x..y** : de **x** à **y** (exemple : **1..5**). * **\*** : une infinité. * **x..\*** : **x** ou plus (exemple : **5..\***). ---- ## Interactions : Associations ![](https://i.imgur.com/UCiDa2y.png) ```csharp public class NewsManager { private News[] _news; private void Ajouter(News news) { _news.Append(news); } } public class News { protected int Id; public void Hydrate(string donnees) {} } ``` ---- ## Interactions : Agrégation/Composition ![](https://i.imgur.com/8hoXuCn.png) - Agrégation - Il y a agrégation entre A et B si l'objet A possède une ou plusieurs instances de B. - Représenté par un losange vide - Composition - Il y a composition entre A et B si toutes les instances de B contenues dans A sont supprimées lorsque A est supprimée. - Représenté par un losange plein ---- ## Exercice 2 ![](https://i.imgur.com/1DRbdGC.png =700x) - Comment une instance de la classe `Dossier` peut accéder à la méthode `compareTo` de la classe `Prestation` ? - En passant par un objet de la collection `mesPrestations`.<!-- .element: class="fragment fade-up fade-in-then-semi-out" --> ---- ## Exercice 2 ![](https://i.imgur.com/1DRbdGC.png =700x) - Quels sont les méthodes directement accessibles à partir d'une instance de la classe `IntervenantExterne` et pourquoi ? - `ajoutePrestation` (car c'est une méthode publique de la classe mère)<!-- .element: class="fragment fade-up fade-in-then-semi-out" --> ---- ## Exercice 2 ![](https://i.imgur.com/1DRbdGC.png =700x) - Quel est le nom du type de lien entre les classes `Dossier` et `Prestation` ? - Lien de composition : lien fort qui lie les 2 classes- A la suppression d'une instance de `Dossier`, les objets de type `Prestation` présents dans la collection `mesPrestations` de ce dossier sont supprimés.<!-- .element: class="fragment fade-up fade-in-then-semi-out" --> ---- ## Exercice 2 ![](https://i.imgur.com/1DRbdGC.png =700x) - Que représente le libellé `mesPrestations` et le signe `*` écrits sur le lien et par quoi concrètement cela se traduit dans les classes ? - Le `*` signifie qu'il y a plusieurs occurrences de `Prestation` dans `Dossier`. `mesPrestations` est donc une propriété de type `Collection` de `Prestation`, et elle est dans `Dossier`.<!-- .element: class="fragment fade-up fade-in-then-semi-out" --> ---- ## Exercice 2 ![](https://i.imgur.com/1DRbdGC.png =700x) - Expliquez de façon détaillée le lien entre les classes `Prestation` et `Intervenant` ainsi que toutes les informations qui sont sur le lien. - `Prestation` contient une propriété objet `l_Intervenant` de type `Intervenant` (1 occurrence). `Intervenant` contient une proprité `lesPrestations` de type `Collection` de `Prestation` (* donc plusieurs occurrences).<!-- .element: class="fragment fade-up fade-in-then-semi-out" --> ---- ## Exercice 3 * Il faut mémoriser les factures avec la date, le client concerné (nom, adresse, mail), le total et la liste des articles (nom, photo, prix). Pour chaque article présent dans une facture, la quantité est mémorisée. * Le programme doit pouvoir, entre autres, réaliser les traitements suivants : - gérer les articles (enregistrer un nouvel article, le modifier, l'afficher) - gérer les clients (enregistrer un nouveau client, le modifier, l'afficher, gérer les factures d'un client) - gérer les factures : - enregistrer une nouvelle facture vide avec le client - ajouter ou supprimer un article dans une facture (avec la quantité) - modifier la quantité d'un article dans une facture - afficher une facture - valider une facture (elle n'est alors plus modifiable) ---- ## Exercice 3 Corrigé ![](https://i.imgur.com/vimW8ev.png) --- # Diagramme d'activités (Activity diagram) > Le diagramme d'activités n'est autre que la transcription dans UML de la représentation du processus telle qu'elle a été élaborée lors du travail qui a préparé la modélisation : il montre l'enchaînement des activités qui concourent au processus. --- ## Diagramme d'activités (Activity diagram) ![](https://i.imgur.com/xesQOPN.png =550x) ---- ## Introduction * Le diagramme d’activité (Activity Diagram) * Fait parti des diagrammes comportementaux * Expose les activités séquentielles et parallèles d’un processus. * Il permet de modéliser des processus métier, des enchaînements d’activités (diagrammes de flux/workflows), des flots de données et des algorithmes complexes. ---- ## Définition * Ensemble de noeuds * Des **actions** (message, faire appel à une autre activité, attente et émission d’événements) * Des **contrôles** (conditions, synchronisation, ...) * Des **objets** (données) * **Départ** et **terminaison** * Transitions entre les noeuds * Swimlanes ou Partitions: représentent le responsable des actions. ---- ## Notions du diagramme d’activité ```plantuml !include https://raw.githubusercontent.com/bschwarz/puml-themes/master/themes/superhero-outline/puml-theme-superhero-outline.puml note right: Etat de départ (*) --> "Vérification de commande" if "Valide ?" then note right: Transition Alternative --> [Oui] "Enregistrement commande" --> (*) note right: Etat de terminaison else --> [Non] "Rejet commande" --> "Information erreur client" note right: Transition (Action) --> (*) endif ``` ---- ## Notions du diagramme d’activité : Synchronisation ```plantuml !include https://raw.githubusercontent.com/bschwarz/puml-themes/master/themes/superhero-outline/puml-theme-superhero-outline.puml (*) --> "Réception de livraison" --> ===B1=== note right: Synchronisation disjonctive --> "Contrôle de qualité" --> ===B2=== ===B1=== --> "Contrôle de quantité" --> ===B2=== note right: Synchronisation conjonctive ===B2=== --> "Enregistrement" --> (*) ``` ---- ## Notions du diagramme d’activité : Itération ```plantuml !include https://raw.githubusercontent.com/bschwarz/puml-themes/master/themes/superhero-outline/puml-theme-superhero-outline.puml (*) --> "Recevoir une commande" --> "Vérifier article" --> "Commander article" if "Reste articles" then note bottom: Transition Alternative Itérative --> [Il le reste des articles] "Vérifier article" else --> [Plus d'articles] (*) endif ``` ---- ## Notions du diagramme d’activité : Swimlanes ```plantuml !include https://raw.githubusercontent.com/bschwarz/puml-themes/master/themes/superhero-outline/puml-theme-superhero-outline.puml |Comptable| start :Enregistrement commande; :Envoi de la facture; |Client| :Paiment de la facture; |Comptable| :Enregistrement du paiement du client; stop ``` ---- ## Construction un diagramme d’activité 1. **Identifiez la portée (« scope ») du diagramme d'activité** Commencez en identifiant ce que vous allez modéliser. Un seul use case? Une partie d'un use case ? Un « workflow » qui inclut plusieurs use cases ? Une méthode de classe ? 2. **Ajouter l’état de départ et de terminaison** 3. **Ajouter les actions** Si vous modélisez un « workflow », introduisez une activité pour chaque processus principal, souvent un use case. Enfin, si vous modélisez une méthode, il est souvent nécessaire d’avoir une action pour chaque grande étape de la méthode. 4. **Ajouter des transitions (séquentielles), des transitions alternatives (conditionnelles), des synchronisations entre des actions, des itérations.** 5. **Identifier des partitions et répartir des actions identifiées dans ces partitions.** ---- ## Exercice : Recette de cuisine * Commencer par Casser le chocolat en morceaux, puis le faire fondre. * En parallèle, casser les oeufs en séparant les blancs des jaunes. * Quand le chocolat est fondu, ajouter les jaunes d'oeuf. * Battre les blancs en neige jusqu'à ce qu'ils soient bien fermes. * Les incorporer délicatement à la préparation chocolat. * Verser dans des ramequins individuels. * Mettre au frais au moins 3 heures au réfrigérateur avant de servir ---- ## Exercice : Recette de cuisine ```plantuml scale 600*600 !include https://raw.githubusercontent.com/bschwarz/puml-themes/master/themes/superhero-outline/puml-theme-superhero-outline.puml (*) --> ===B1=== --> "Casser les oeufs" --> "séparer le blanc des jaunes" --> ===B2=== --> Battre les blancs --> ===B4=== --> "Mélanger" -right-> "Verser" -right-> "Mettre au frigo" -right-> "Attendre 3h" -right-> (*) ===B2=== --> ===B3=== ===B1=== --> "Casser le chocolat" --> "Faire fondre le chocolat" --> ===B3=== ===B3=== --> "Ajouter les jaunes au chocolat" --> ===B4=== ``` ---- ## Exercice : Recette de cuisine à deux ![](https://media.giphy.com/media/mBXrp7QlD60sW3XDEb/source.gif) ---- ## Exercice : Recette de cuisine à deux ---- ## Exercice : Diagramme to Code ![](https://i.imgur.com/UKLrxhZ.png =440x)
{"metaMigratedAt":"2023-06-15T12:44:51.075Z","metaMigratedFrom":"YAML","title":"I-CH 326 - UML","breaks":true,"slideOptions":"{\"theme\":\"moonl\",\"spotlight\":{\"enabled\":false}}","contributors":"[{\"id\":\"2ff8bf3a-d09c-4308-a7a7-64e5fb1c4783\",\"add\":32020,\"del\":8889}]"}
    330 views