Université du Havre
Plan Général
• Introduction
• Les cas d’utilisation
• Les scénarios (diagrammes d’activité/de
séquence)
• Diagrammes de classe
• Diagrammes d’état
UML
• Unified Modeling Language :
– Méthode d’analyse et de conception orientée objet
• Analyse = recensement et définition des besoins
• Conception = définition d’une architecture « abstraite »
– Première version : 1996
• Précurseurs
– Merise (années 70) : non objet
– OMT : Object Modeling Technique (1990)
– Booch, Oose (Object Oriented Software Engineering)
• Volonté des concepteurs d’UML :
– Unifier les concepts intéressants de ces méthodes
UML : sources
d’information
• Site Web de Rational :
– http://www.rational.com
• Mailing-list française :
– majordomo@essaim.univ-mulhouse.fr
• UML Revision Task Force
– http://uml.shl.com
Préambule
• UML :
méthode
méthodologie
mise en œuvre pas aisée
• UML, méthode unifiée beaucoup de
concepts
– trop de concepts ?
– ensemble de notations à disposition, pas
nécessaire de tout utiliser
– méthode extensible
Analyse : expression du besoin
• Buts :
– Qui ?
– Quoi ?
– Exemples
• Comment : principalement 2 types de
schémas :
– cas d’utilisation
– scénarii
Utilisateurs
et
Cas d’utilisation
Diagrammes d’utilisateurs
et de cas d’utilisation
• But : recenser les besoins
• Démarche
– recherche des types d’utilisateurs
– analyse des cas d’utilisation pour chacun
– relations entre cas d’utilisations
Les utilisateurs
• Exemples
client Comptable
Personnel
secrétaire Consulter une fiche de paie
Liens entre cas
d’utilisation (1)
• Utilisation :
implique une relation entre cas
Comptable
Authentification
Personnel
Consulter une fiche de paie
Liens entre cas
d’utilisation (2)
• Extension :
sorte d’héritage entre cas
« étend »
Consulter une fiche de paie Consulter document
Diagrammes de séquence
Diagrammes de séquence :
exemple introductif
Consultation d’un salaire par le DRH
Objet actif
(en attente Objet inactif
du retour
d’une Destruction d’un objet
procédure)
Axes Objet/Utilisateur d’un DdS
(3)
• Représentations particulières :
– Appels récursifs
– Comportements conditionnels
Messages dans un DdS
(1)
• Définition :
échange d’informations entre objets ou entre
objet et acteur
• Représentation :
– flèche surmontée d’un nom
• Trois genre de message :
– signaux pas de paramètres ;
– envoi de données paramètres, pas de résultat attendus
;
– demande de données résultat attendu, paramètres
éventuels.
Messages dans un DdS
(2)
• Types de message :
– première classification :
• synchrone
• asynchrone
– deuxième classification :
• durée d’acheminement négligeable
• lent
Messages dans un DdS (3)
Représentation des
paramètres
• Paramètres nom (p1, p2)
d’entrée
r:=nom
• Paramètres de
sortie / résultat
Messages dans un DdS (4)
Cas des messages
synchrones
2 types de représentation :
A B
– Explicite :
A B
– Implicite :
Messages dans un DdS (5)
Messages conditionnels
• Condition :
– proposition logique entre crochets devant être
vraie pour que le message soit envoyé :
A B
[x >0] ok(id)
A B
• Choix : [x > 0] ok(id)
[x < 0] ko(id)
Messages dans un DdS (6) :
Etiquettes et contraintes
• Exemple
A B C
{b - a < 5 s}
b
Diagrammes de classe
Représentation d’une
• classe
Forme de base : Classe de l’attribut
Optionnel, mais recommandé
Titre
1 attribut :
droit nom:type = valeurParDéfaut
Attributs
Public : +
Optionnel
Privé : -
Protégé : #
Méthodes
1 méthode :
droit nom(ListeParamètres):typeRetour
Type de l’éventuelle
Liste de 0 à n éléments séparés valeur de retour
par des virgules et de la forme :
nom : type=valeurParDéfaut
Un exemple de classe
• Cadre :
– logiciel pour dessiner/manipuler des courbes
• Classe Courbe : Courbe
- NomAbscisse:Chaîne
- NomOrdonnée: Chaîne
- MinAbs:Réel
- MaxAbs :Réel
- MinOrd :Réel
- MaxOrd :Réel
- GradAbs :Réel
- GradOrd :Réel
- fonc:Fonction
- coul:Couleur
+ ChangerZone(min:réel,max:réel)
+ Calculerbornes()
+ ChangerCouleur(coul:Couleur)
Classes paramétrées
• Rôle du paramètre : implanter la généricité
peut représenter :
• un type
p1 est un type
• une valeur
p2 est une valeur de type entier
• Notation : exemple
p1, p2: entier
Titre
Champ1 : p1
Champ2:entier=p2
Utilisation des classes
paramétrées
• Attention :
– Classe paramétrée :
schéma de classe
classe
Doit être instanciée pour pouvoir être utilisée
• Instanciation d’une classe paramétrée :
Titre<Courbe,4>
Héritage « de base »
• Représenter le fait que Titre2 hérite de Titre1
:
Titre1
Attributs1
Méthodes1
Titre2
Attributs2
Méthodes2
Plusieurs classes filles
• Deux représentations possibles
Titre1 Titre1
Attributs1 Attributs1
Méthodes1 Méthodes1
{disjoint} {recouvrement}
B C B C
Notion d’association entre
classes
• Exemples
Matière
a pour élève
Enseignant a pour enseignant Elève
Association :
premières caractéristiques
• Association :
– un lien entre deux classes
– deux sens de lectures éventuels : pour
chacun :
• une direction
• un nom
– possibilité de nommer directement la
relation sans passer par les sens de
lecture
Notion de multiplicité
maximale
• Exemples
– un élève fait partie d’une seule filière
1
Elève Filière
– une filière est composée de plusieurs matières
*
Filière Matière
1..*
Filière Matière
0..*
Elève Option
Multiplicité : expression
complète
• Une association implique deux sens, donc la
multiplicité s’exprime des deux côtés :
1..* 1
Elève Filière
1..* 1..*
Filière Matière
0..* 0..*
Elève Option
Cardinalités sur l’exemple
• Exercice : placer les bonnes cardinalités
Matière
a pour élève
Enseignant a pour enseignant Elève
multiplicité : cas général
• Plusieurs options :
– les bornes inférieures ne sont pas
forcément 0 ou 1 ;
– les bornes supérieures ne sont pas
forcément 1 ou * ;
– il est possible de spécifier plusieurs valeurs
ou intervalles
2,3
de valeurs séparés par des
3..6, 10..*
A
virgules B
• Exemple :
multiplicité : conclusion
• Intérêts :
– contraindre au maximum le système pour éviter les
erreurs par la suite
– aider à comprendre la structure et les rôles et
dépendances des classes
• Dilemme :
– plus elles sont précises, moins les erreurs sont possibles
– plus elles sont précises, moins le système est
extensible/souple
trouver une juste mesure
Associations n-aires :
pourquoi
• Limite des associations binaires :
Matière 1..*
1..*
1..* 1..*
a pour élève
Enseignant 1..* a pour enseignant 1..* Elève
Une matière n’est enseignée à un élève que par
un enseignant, mais cela n’apparaît pas sur le
schéma.
Associations n-aires : comment
Matière
0..*
Enseignement
0..1
0..*
Enseignant Elève
0..*
chef de
Problème d’interprétation :
un chef dirige plusieurs personnes, ou une
personne a plusieurs chefs ?
Notion de rôle
• Reprise de l’exemple :
chef membre de
0..1 Personnel 1..* 0..1 Entreprise
0..* subalterne
chef de
Elève Matière
Attribut de
relation
note
Résidence {or}
Locataire
Qualification d’une
association
• Exemple :
sans qualification avec qualification
Plateau de dames Plateau de dames
1 Abscisse
Ordonnée
1
Qualification
100 1
Case Case
• Interprétation :
à partir d’un plateau de jeu, d’une abscisse et
d’une ordonnée ne peut correspondre qu’une
seule case
Interfaces (1)
• Définition :
– un ensemble de profils de méthodes
pas d’attribut (donc d’état)
pas d’instances
pas d’implantation
pas de relation avec d’autres classes
• Utilisation :
– comme généralisation :
• implantée par certaines classes
• requises par d’autres
Interfaces (2)
• Représentation :
« interface »
Ordre
égal : booléen
inférieur : booléen
Entiers Variant
Agrégation
• Définition :
association binaire à sémantique particulière :
une des classes apparaît comme étant un
constituant de l’autre.
• Notation :
Équivalent à :
• Exemple : Voiture
Voiture
4
4
Moteur Roue
Moteur Roue
Composition
• Définition :
agrégation telle que chaque composant ne peut
être associé qu’à un composé
• Notation :
• Exemple : Équivalent à :
Classe
Classe
1 N.B. l’exemple de la voiture
1..*
1..* est valable si le moteur et les
Élève roues sont identifiés par des
Élève
numéros de série
Composition : autre
représentation
• Représenter les composants dans les
composés
Voiture
Moteur
n° de série
0..*
Modèle
fabriquant
Diagrammes d’états
Rôle
• Jusqu’à présent, on a vu :
– les besoins (uses cases, scénarios)
– l’aspect statique (diagramme de classes)
– l’aspect dynamique entre composants
(scénarios)
manque :
– aspect dynamique d’un objet
Etudiant Retraité
Chômeur
Les types d’états
• Etat initial :
– indispensable
– tout objet commence dans cet état
– notation :
• Etat final :
– pas indispensable
– passage obligé pour tout objet à détruire
– notation :
• Etat intermédiaire :
Nom N.B. : nom pas indispensable,
mais FORTEMENT conseillé
Représentation des
états intermédiaires
• Deux représentations possibles :
Etat
Etat
Transitions et événements
• Transition :
– Définition
passage potentiel d’un état à un autre (éventuellement le même)
– Représentation :
• Evénement :
– (souvent) : message venant de l’extérieur de l’objet
– (souvent) : figure sur les diagrammes de séquence
• En général, un événement est associé à une
transition
Exemple complété
ESSTINIEN changement employeur
embauche
Actif
départ retraite
licenciement décès
Etudiant Retraité
embauche
Inscription ANPE
départ retraite
Chômeur
Evénements :
approfondissement
• Notation :
nom(paramètres) [condition]/action
Optionnel Optionnel Optionnel
• Explications
– Condition :
doit être vérifiée pour que l’événement soit pris en
compte
– Action :
décrit une action à exécuter (souvent, une méthode de
la classe) si l’événement survient et doit être pris en
compte
Transitions internes
• Notation :
comme des événements à l’intérieur d’un état.
• Exemple :
Etat1
Ev1/action1
Ev2[cond2]/action2
• Evénements particuliers :
– entry : dès que l’on rentre dans l’état (par transition
externe)
– exit : dès que l’on quitte l’état (par transition externe)
– do : l’action associée est exécutée tant que l’on est dans
l’état
Etats composites :
Introduction
• Principe :
Un état peut être composé de plusieurs sous-états.
• Exemple :
ESSTINIEN Ancien
Actif
Etudiant Retraité
Chômeur
Etats composites :
Représentation conseillée
ESSTINIEN Ancien
Actif
Etudiant Retraité
Chômeur
Etats composites :
Représentation abstraite simple
ESSTINIEN
Etudiant Ancien
Etats composites :
Représentation abstraite
générale
• Principe :
s’il y a entrée ou sortie directe avec des sous-
états, ceux-ci sont représentés par de simples
traits
• Exemple :
A C
D
Agrégation d’états (1)
• Principe :
état = composition (simultanée) de plusieurs sous-
états
• Exemple : Jeune
Enfant parle
Adulte
Adolescent écrit
Agrégation d’états (2)
• Nouvel exemple :
B
E
A C G
F
D
H
• Chemins possibles :
A, (B,E), (B,F), G
A, (B,E), (C,E), G
A, (B,E), (C,E), (D,E), (D,F), G
A, (B,E), (C,E), (D,E), H
Point de jonction
• But :
regrouper ou diviser des transitions
• Exemple :
A B
[x <= 0] [x > 0]
Dans l’état A, la transition
en rouge n’est activée que
C si l’une des branche en
[a > 100] [a = 50]
bleue est activable.
[a < 0]
D E F
Point de choix dynamique
• But :
regrouper au diviser des transitions !
• Exemple :
A B
D E F
Transitions simultanées
A B
E F
C D
• Interprétation :
On ne peut quitter D pour E que si dans le
même temps, on quitte A
Diagrammes d’activité
Rôle
Représenter l’aspect dynamique
[OK]
Vérifier si dans
bâtiment
Commentaires
• Légende :
Indique un choix
• Problème du schéma :
– quelle est la réponse selon les cas ?
Deuxième exemple
amélioré
[entrer] Vérifier si a le [Oui] Vérifier si déjà
droit dans un bâtiment
[Sortir]
[Non] [Non] [Oui]
[Oui] [Non]
Réponse Réponse
[OK] [KO]
Explications
NomObjet
[Etat]
Objet utilisé en entrée ou produit en sortie
• Notations de base :
Production
NomObjet NomObjet
[Etat] [Etat]
Flot de contrôle Utilisation
Utilisation et flot
Notation particulière
• En théorie • En Pratique
NomObjet
[Etat]
NomObjet
[Etat]
Les couloirs (swimlanes)
• Rôle :
séparer les activités selon l’objet/l’acteur
intervenant
• Exemple :
Système Voyant Vert Porte Voyant Rouge
Allumer Débloquer
De la conception à
l’implantation
class porte {
• Exemple : private :
Porte
int fermee = 1;
- fermée : bool = vrai
int bloquee ;
- bloquée : bool
public :
+ débloquer() ;
void debloquer();
}
Bases
• Gérer la visibilité correctement :
+ public
- privé
# protégé
• Convertir éventuellement les types
exemples : bool int
string char[]
• Garder des noms similaires, au
renommage prêt nécessaire pour le
langage cible
Héritage simple sans
recouvrement
class personne {
Personne private :
nom : string char nom[50];
int age;
âge : string
}
class bateau {
int vitesseEau;
Véhicule amphibie }
Class correspondance {
class professeur { eleve *lEleve;
char nom[50]; professeur *leProfPrincipal;
char prenom[50]; }
liste<eleve*> eleves; liste<correspondance> assoc;
}
• Première solution :
Class matiere {
Class enseignant { char intitule[50];
char nom[50]; int vol_horaire;
liste<matiere*> enseignements; liste <enseignant*> intervenants;
} }
Associations N-M :
Solution améliorée
• Inconvénient solution précédente :
redondance
• Autre solution : création d’une classe
association Class matiere {
Class enseignant { char intitule[50];
char nom[50]; int vol_horaire;
} }
Class interventions {
enseignant *intervenant;
matiere *discipline;
}
liste <interventions> affectations
Associations 1-1
• Définition :
la cardinalité maximale vaut 1 des deux côtés de
la relation
• Exemple : Classe 0..1 Prof. principal 1
niveau Professeur
numéro nom
• Solutions au choix :
– pointeur sur « professeur » dans « classe »
– pointeur sur « classe » dans « professeur »
• Comment choisir :
si navigabilité n’intervient pas, limiter les pointeurs
nuls
Attributs de relation :
cas général
• A mettre dans les champs de la classe
association
• Exemple :
note
Class eleve {
specialisation *filiere; Class specialisation {
float note; }
}
Cardinalités maximales petites
:
• Exemple :
0..1 1..3
A B
chA chB
• Principe :
passer par un tableau
• Application :
Class A {
typA chA; Class B {
B* assocB[3]; typB chB;
} }
Respect des cardinalités
minimales
• Remarque préliminaire
– un lien = un pointeur
• Principe général :
– déclarer les liens comme variables privées
– définir des fonctions d’accès pour établir les
liens
– faire la vérification dans le corps de ces
fonction d ’accès
– notamment : interdire le pointeur nul si la
cardinalité minimale est à 1
Agrégations
• Rappel :
agrégation = association particulière
Faire comme pour les associations
• Exemple :
class voiture {
Voiture char modele[50];
modèle moteur* vroum;
}
1 Class moteur {
char moteur[50];
Moteur }
Compositions
• Composition = Agrégation particulière
1ère solution :
procéder comme pour l’agrégation
• 2ème solution :
composant variable d ’instance du
composé
• Voiture
Exemple : Class voiture {
char immatriculation[20];
Immatriculation moteur vroum;
}
1
Class moteur {
Moteur char numeroSerie[20];
Numéro de série }
Associations n-aires
• Exemple :
0..1 Enseignant
Groupe 0..*
Affect.
0..*
Matière
• Représentation C++ :
class groupe {
} class affectation { Ne pas oublier
groupe *gr; dans la classe
class matiere { enseignant *ens; affectation de
} matiere *mat; vérifier la cardi-
} nalité dans les
class enseignant { liste<affectation> affectations fonctions
} d’ajout d’un
élément
Corps des méthodes
Principes généraux
• Partir du diagramme d’activité :
– une activité
sur le même objet : appel à une autre méthode*, à
définir éventuellement, de la même classe
sur un autre objet : appel de la méthode de l’objet
correspondant => objet.méthode()
– un choix
un test => if
– synchronisation :
effectuer dans un ordre quelconque (si implantation
séquentielle) chacune des branches
* a priori privée
Développer des classes
« sûres »
Quelques conseils
Traçabilité
• Lien avec les documents amonts :
– spécification UML
• schémas de classe pour la structure
• diagrammes d’activité, de séquence et d’état pour les
méthodes
• diagrammes de cas d’utilisation, de séquences pour
les jeux de tests
– cahier des charges
• Lien avec les autres fichiers
limiter au maximum les variables globales. Si
impossible, documenter au mieux
Documentation
• Fichier d’en-tête
– rappel : toujours en faire un
– dans le fichier d’en-tête, préciser rôles et types des
paramètres d’entrée et de sortie de chaque méthode
• Fichier « corps » :
– Documenter chaque variable d’instance
– Préciser les rôles et paramètres des méthodes privées
– Détailler chaque méthode
• rappeler son fonctionnement global
• préciser ses conditions d’appel
• mentionner le résultat attendu en fonction des
paramètres
• détailler plus finement le code « subtil »
Protection
• Prudence :
Vérifier la validité des paramètres au début de
chaque méthode, et gérer les cas d’erreurs
Inconvénient : perte en efficacité SI
CRITIQUE
• Adjoindre l’efficacitéprivate :
int methodereelle(int p1, int p2) {
public :
action;
int methode(int p1, int p2) {
return 0;}
if (!cond(p1,p2))
public :
{return 1;}
int methode(int p1, int p2) {
else
if (!cond(p1,p2))
{action;
{return 1;}
return 0;}
else
}
{return methodereelle(p1, p2);}
}
friend class besoinefficace;
Testabilité
• Tests des méthodes
– Pour chaque méthode (importante) adjoindre
une méthode (publique, à moins qu’une classe
« teste » soit déclarée amie) permettant de la
tester sur différents cas de figure si nécessaire
• Test d’une classe
– Ecrire une méthode permettant de tester le
fonctionnement global d’un objet au fur et à
mesure de l’appel à différentes méthodes de la
classe
permet de vérifier le respect du diagramme d’état
écriture d’une méthode affichant l’état d’un objet
Consignes générales
• Tester au fur et à mesure
• Simuler si besoin est des fonctions pas
encore implantées
• Dans le cadre d’un processus itératif *:
1. Définir la structure de base
2. Développer et les fonctionnalités essentielles
3. Passer enfin aux fonctions annexes,
progressivement, en remettant éventuellement
en cause certains choix de structuration ou
d ’implantation
*processsus valable notamment pour un TP