Polytech Paris-Sud Formation initiale 3 e année Spécialité Informatique Année 2014-2015 UML Diagrammes de classes (suite) Delphine Longuet delphine.longuet@lri.fr
Opérations Opérations Service qui peut être demandé à tout objet de la classe Comportement commun à tous les objets de la classe Client Compte pré naissance : Date ouvrircompte(init : float) devenirproprio(c : Compte) propriétaire 1..2 possède comptes 1..* numéro : int devise : Devise solde : float déposer(montant : float) retirer(montant : float) solde() : float D. Longuet - UML 2
Effets possibles d'une opération Opérations Renvoyer le résultat d'un calcul MonLivretA : Compte numéro = 123456 devise = EUR solde = 3509,43 déposer(montant : float) retirer(montant : float) solde() : float solde() 3509,43 D. Longuet - UML 3
Effets possibles d'une opération Opérations Renvoyer le résultat d'un calcul Modifier l'état du système - modification de la valeur des attributs MonLivretA : Compte numéro = 123456 devise = EUR solde = 3509,43 déposer(montant : float) retirer(montant : float) solde() : float déposer(150,0) MonLivretA : Compte numéro = 123456 devise = EUR solde = 3659,43 déposer(montant : float) retirer(montant : float) solde() : float D. Longuet - UML 4
Effets possibles d'une opération Opérations Renvoyer le résultat d'un calcul Modifier l'état du système - modification de la valeur des attributs - ajout/suppressions de liens entre objets MarieDupont : Personne CompteJoint : Compte MarieDupont : Personne CompteJoint : Compte JeanDupont : Personne nom = "Dupont" devenirproprio(comptejoint) JeanDupont : Personne nom = "Dupont" prénom = "Jean" prénom = "Jean" naissance = 20/08/1990 naissance = 20/08/1990 ouvrircompte(init : float) ouvrircompte(init : float) devenirproprio(c : Compte) devenirproprio(c : Compte) D. Longuet - UML 5
Effets possibles d'une opération Opérations Renvoyer le résultat d'un calcul Modifier l'état du système - modification de la valeur des attributs - ajout/suppressions de liens entre objets - création/destruction d'objets AnneBérou : Personne nom = "Bérou" prénom = "Anne" naissance = 14/12/1965 ouvrircompte(init : float) devenirproprio(c : Compte) ouvrircompte(1000,0) AnneBérou : Personne nom = "Bérou" prénom = "Anne" naissance = 14/12/1965 ouvrircompte(init : float) devenirproprio(c : Compte) LivretA : Compte numéro = 123456 devise = EUR solde = 1000,0 déposer(montant : float) retirer(montant : float) solde() : float D. Longuet - UML 6
Héritage d'opération Opération commune aux sous-classes : Définition dans la super-classe déposer(montant : float) {solde := solde+montant} Compte numéro : int devise : Devise solde : float déposer(montant : float) retirer(montant : float) solde() : float opération commune à tous les comptes CompteCourant découvertautorisé : float fraisdécouvert : float CompteÉpargne plafond : float taux : float calculerintérêts() : float D. Longuet - UML 8
Redéfinition d'opération Opération commune aux sous-classes : Définition dans la super-classe Possibilité de redéfinition locale de l'opération dans une sous-classe pour prendre en compte un cas particulier déposer(montant : float) {solde := solde+montant} Compte numéro : int devise : Devise solde : float déposer(montant : float) retirer(montant : float) solde() : float opération commune à tous les comptes déposer(montant : float) {if(solde+montant <= plafond) then solde := solde+montant} CompteCourant découvertautorisé : float fraisdécouvert : float redéfinition CompteÉpargne plafond : float taux : float calculerintérêts() : float déposer(montant : float) D. Longuet - UML 9
Classe abstraite Classe sans instance car certaines opérations non définies Opération non définie en italique Nom de la classe en italique (ou stéréotype «abstract») Exemple : On ne peut pas calculer la surface d'une forme sans savoir de quelle forme il s'agit opération non définie (abstraite) Forme surface() : float D. Longuet - UML 10
Polymorphisme Contexte : Définition d'une opération abstraite dans les classes héritant d'une classe abstraite Opération polymorphe : Opération définie dans différentes sous-classes mais opération spécifique à la sous-classe Forme surface = longueur*largeur surface() : float surface = pi*rayon*rayon Rectangle longueur : float largeur : float opération polymorphe Cercle rayon : float surface() : float surface() : float D. Longuet - UML 11
Interface Liste d'opérations constituant un contrat à respecter par les classes réalisant l'interface Pas une classe, ne peut pas servir à créer des objets Toutes les opérations sont abstraites Point abscisse : float ordonnée : float égal(object o) : boolean supérieur(object o) : boolean classes réalisant l'interface «interface» Comparable Date égal(object o) : boolean jour : int supérieur(object o) : boolean mois : int année : int égal(object o) : boolean supérieur(object o) : boolean diff(date d) : int String content : string égal(object o) : boolean supérieur(object o) : boolean print() D. Longuet - UML 12
Attributs et opérations de classes Notations avancées Attribut de classe : valeur commune à toutes les instances Opération de classe : opération sur la classe elle-même (création de nouvelles instances par exemple) Soulignés dans la classe Article - référence : int - prixht : float - nbinstances : int + calculerprixttc(taxe : float) : float + créer() + compterinstances() : int D. Longuet - UML 14
Notations avancées Visibilité + : public, accessible à toutes les classes # : protégé, accessible uniquement aux sous-classes - : privé, inaccessible à tout objet hors de la classe Pas de visibilité par défaut Vecteur - début : Point - /fin : Point - longueur : float - angle : float # ajouter(v : Vecteur) : Vecteur + déplace(p : Point) D. Longuet - UML 15
Attribut dérivé Peut être calculé à tout moment à partir d'autres informations du système Notation : /attribut Peut nécessiter des informations de plusieurs classes Vecteur attribut dérivé - début : Point - /fin : Point - longueur : float - angle : float # ajouter(v : Vecteur) : Vecteur + déplace(p : Point) fin = (longueur*cos(angle), longueur*sin(angle)) D. Longuet - UML 16
Association dérivée Redondance d'une association : Association n'apportant pas d'information supplémentaire, se demander si nécessaire Banque 1..* banques 1 banque 1..* comptes Compte numéro : int devise : Devise solde : float 1..* comptes 1 propriétaire Client naissance : Date 1..* clients ClientsBanque D. Longuet - UML 17
Association dérivée Redondance d'une association : Association n'apportant pas d'information supplémentaire, se demander si nécessaire Si nécessaire, la faire apparaître comme association dérivée Association dérivée : Peut être calculée à tout moment à partir d'autres informations du système Notation : /association Banque 1..* banques 1 banque 1..* comptes Compte numéro : int devise : Devise solde : float 1..* comptes 1 propriétaire Client naissance : Date 1..* clients association dérivée /ClientsBanque D. Longuet - UML 18
Limites du diagramme de classes Diagramme de classes représente la structure du système en termes d'objets et de relations entre ces objets Ne permet pas de représenter : Valeurs autorisées des attributs Conditions sur les associations Relations entre les attributs ou entre les associations Expression des contraintes liées au diagramme : Notes dans le diagramme Texte accompagnant le diagramme OCL : langage de contraintes formel associé à UML D. Longuet - UML 19
Propriétés : Contraintes, invariants Portant sur les éléments du modèle Doivent être vérifiées à tout instant En général, restriction sur les diagrammes d'objets possibles à partir du diagramme de classes Héritage des contraintes de la super-classe vers les sous-classes Contraintes présentes dans le diagramme : Type des attributs Multiplicités des associations D. Longuet - UML 20
Contraintes sur les attributs {age = diff(naissance,today)} {naissance today} sous forme de note Personne naissance : Date /age : int {age 0} dans le diagramme Contraintes sur la classe Personne : L'âge est toujours positif L'âge est calculé comme la différence de la date de naissance et la date d'aujourd'hui La date de naissance est inférieure ou égale à la date d'aujourd'hui dans un document annexe D. Longuet - UML 21
Contraintes associées à la multiplicité Compte numero : int * 1..* Personne devise : Devise solde : float pre naissance : Date Par défaut : ensemble non ordonné 2 parents Personne enfants pre *{ordered} naissance : Date ensemble ordonné Commande numero : int total : float date : Date * 1..* {nonunique} Pizza id : int prix : float multi-ensemble (chaque élément peut apparaître plusieurs fois) PolygoneRempli multi-ensemble 1 ordonné 1..*{sequence} Point abscisse : float ordonnée : float D. Longuet - UML 22
Contraintes sur les associations Salle capacité : int 1 1..* Place numéro : int contrainte sur une association nombre de places associées à une salle = capacité P1:Place Olympia:Salle nom = Olympia capacité = 2000 numéro = 1 P2:Place numéro = 2 P3:Place numéro = 3 D. Longuet - UML 23
Contraintes sur les associations subordonné 1..* Personne pré naissance : Date 0..1 chef 1..* 0..1 Entreprise employés employeur {pour toute Personne p, contrainte portant sur p.employeur = p.chef.employeur} plusieurs associations PierreDupont : Personne nom = "Dupont" prénom = "Pierre" naissance = 12/04/1988 employeur IBM:Entreprise nom = "IBM" chef AnneBérou : Personne nom = "Bérou" prénom = "Anne" employeur Microsoft:Entreprise nom = "Microsoft" naissance = 14/12/1965 D. Longuet - UML 24
Contraintes, invariants {age = diff(naissance,today)} Personne naissance : Date /age : int {age 0} 1 * ExpériencesPro entreprise : string entrée : Date sortie : Date {ordered} * 1 {subset} appartient administre D. Longuet - UML 25 * * Groupe thème : string création : Date L'âge est toujours positif L'âge est calculé comme la différence entre la date de naissance et la date d'aujourd'hui L'administrateur d'un groupe en est membre On a accès aux expériences professionnelles dans l'ordre de la date d'entrée
Contraintes en OCL Banque 1 banque 1..* banques 1..* clients Client naissance : Date 1 propriétaire comptes 1..* 1..* comptes Compte numéro : int devise : Devise solde : float dest 1 0..* 1 0..* orig Virement montant : float date : Date Tout propriétaire d un compte est client de la banque hébergeant ce compte. context c : Compte inv : c.banque.clients -> include(c.propriétaire) Tout client d une banque y possède au moins un compte. context b : Banque inv : b.clients -> forall(cl cl.comptes -> select(c c.banque = b) -> size() >= 1) Les virements ne sont autorisés qu'entre des comptes partageant la même devise. context v : Virement inv : v.orig.devise = v.dest.devise D. Longuet - UML 26