Lecture UML-Code
Lecture UML-Code
Lecture UML-Code
A. Madani (madaniabdellah@gmail.com)
1
Génie Logiciel
UML – Partie II
Rappels (partie I)
Passage vers le code
De UML vers Java
Études de cas
De l’analyse des besoins au code
Designs patterns
Introduction
Patterns de création
Patterns structuraux
Patterns comportementaux
2
Diagramme d’UML (Rappels)
Cas d’utilisation
Objets Composants
Vue externe
(fonctions système)
Séquence Vue déploiement
Vue logique dynamique
(Environnement
(Comportement)
d’implantation)
Collaboration
Activités
États transitions Déploiement
3
Correspondance UML et Java
madaniabdellah@gmail.com
4
Traduction d’une classe
5
Traduction d’une classe
class Personne{
…
…
Personne ….
}
6
Traduction d’une classe
7
Traduction d’une classe
8
Traduction d’une classe
9
Traduction d’une classe
interface Forme {
…
…
Forme …
}
10
Traduction des attributs
12
Traduction des opérations
class Personne {
private int code;
private String nom;
private static int nombre;
public Personne() {
}
public static int getNombre(){
}
public String getInf(){
}
}
13
Traduction des relations
Réalisation
14
Traduction des relations
(La généralisation)
Le concept UML de généralisation se traduit
directement par le mécanisme de l’héritage
dans les langages objets.
Java, contrairement à C++ interdit l’héritage
multiple entre classes.
15
Traduction des relations
(La généralisation)
Class Personne{
Personne …
…
…
}
Class Employe extends
Employe Personne{
…
…
…
}
16
Traduction des relations
(La réalisation )
Une classe UML peut implémenter plusieurs
interfaces.
Contrairement à C++, le langage Java
propose directement ce mécanisme.
17
Traduction des relations
(Réalisation)
interface A{
…
A B …
}
interface B{
…
…
}
C class C implements A, B {
…
…
}
18
Traduction des relations
(Les associations)
Les associations navigables UML se
traduisent par du code Java qui dépend de :
la multiplicité de l’extrémité concernée (pointée
par la flèche)
mais aussi de l’existence ou pas d’une contrainte
{ordered} ou d’un qualificatif.
Nous allons voir tout cela du plus simple au
plus complexe :
Une association navigable avec une multiplicité 1
Une association navigable avec une multiplicité *
19
Traduction des relations
(Les associations)
Une association navigable avec une
multiplicité 1 se traduit par une variable
d’instance de type référence vers une
instance de classe.
Une multiplicité « * » va se traduire par un
attribut de type collection de références
d’objets au lieu d’une simple référence sur un
objet.
20
Traduction des relations
(Les associations)
La difficulté consiste à choisir la bonne collection
parmi les très nombreuses classes de base que
propose Java.
Bien qu’il soit possible de créer des tableaux
d’objets, ce n’est pas forcément la bonne solution.
En pratique, on préfère plutôt recourir à des
collections, parmi lesquelles les plus utilisées sont :
ArrayList, SortedList et HashTable.
Utilisez ArrayList si vous devez respecter un ordre et
récupérer les objets à partir d’un indice entier
Utilisez HashTable si vous souhaitez récupérer les objets à
partir d’une clé arbitraire.
21
Traduction des relations
(Les associations)
22
Traduction des relations
(Les associations)
Une association bidirectionnelle se traduit
simplement par une paire de références, une
dans chaque classe impliquée dans
l’association.
Les noms des rôles aux extrémités d’une
association servent à nommer les variables
de type référence.
23
Traduction des relations
(Les associations)
24
Traduction des relations
(Les associations)
25
Traduction des relations
(La classe association)
Elle possède tout à la fois les caractéristiques
d’une association et d’une classe et peut
donc porter des attributs qui se valorisent
pour chaque lien.
Ce concept UML avancé n’existe pas dans
les langages de programmation objet, il faut
donc le traduire en le transformant en classe
normale, et en ajoutant des variables de type
référence.
26
Traduction des relations
(La classe association)
27
UML
abdellah_madani@yahoo.fr 28
De UML vers le modèle relationnel
abdellah_madani@yahoo.fr 29
Classe en Relationnel
abdellah_madani@yahoo.fr 30
Traduction d'une classe
En Relationnel
Compte(NCompte, Solde)
Compte
En SQL
- N°Compte : int
Create table Compte( - Solde : float
+ <<Constructor>> Compte (int N°Compte, float Solde)
NCompte smallint, + deposer (float Solde) : void
+ retirer (float Solde) : float
Solde decimal, + avoirSolde () : String
abdellah_madani@yahoo.fr 31
Généralisation/spécialisation en
Relationnel
Plusieurs méthodes de traduction en
Relationnel :
Représenter toutes les classes d’une
arborescence d’héritage par une seule table
relationnelle
Représenter chaque classe par une table
abdellah_madani@yahoo.fr 32
Généralisation/spécialisation en
Relationnel
La solution la plus simple est de modéliser
toute une hiérarchie de classes dans une
même table
Chaque classe ajoutant ses propres attributs
comme de nouveaux champs.
Il nous suffit alors d’ajouter un champ
contenant le type de l’instance pour pouvoir
charger les champs correspondants.
abdellah_madani@yahoo.fr 33
Généralisation/spécialisation en
Relationnel
abdellah_madani@yahoo.fr 34
Associations en Relationnel
(Association un-à-un)
Deux solutions sont possibles :
une clé étrangère dans chacune des tables
associées
la fusion des deux tables dans une seule
abdellah_madani@yahoo.fr 35
Associations en Relationnel
(Association un-à-un)
1ère Solution
Pays(IdPays, NomP,#IdCapitale)
Capitales(IdCapitale, NomC, #IdPays)
2ième Solution
Pays(IdPays, NomP, NomC)
abdellah_madani@yahoo.fr 36
Associations en Relationnel
(Association un-à-un)
1ère Solution
create table Pays(IdPays integer primary key,
…
IdCapitale integer foreign key references capitales
(IdCapitale))
et
create table Capitales(IdCapitale integer primary key,
…,
IdPays integer foreign key refernces pays(IdPays))
2ième Solution
Pays(IdPays integer primary key,
NomP varchar(20),
NomC varchar(20))
abdellah_madani@yahoo.fr 37
Associations en Relationnel
(Association un-à-plusieurs)
Une seule solution est possible :
migration de la clé du côté de 1 vers la table
du côté de plusieurs
La clé migrée jouera le rôle de clé étrangère
abdellah_madani@yahoo.fr 38
Associations en Relationnel
(Association un-à-plusieurs)
En Relationnel
Dept(IdDept, Nomdept)
Emp(IdEmp, NomEmp, #IdDept)
En SQL
Create table dept(…)
Create table emp(IdEmp integer primary key,
NomEmp varchar(20),
IdDept integer foreign key references Dept(IdDept)
)
abdellah_madani@yahoo.fr 39
Associations en Relationnel
(Association plusieurs-à-plusieurs)
L’association est traduite par une table dont
la clé primaire est la concaténation des clés
primaires des tables associées
La table résultante aura :
Une seule clé primaire
Deux clés étrangères
abdellah_madani@yahoo.fr 40
Traduction des associations en Relationnel
(Association plusieurs-à-plusieurs)
En Relationnel
Articles(Ref, Des, PU)
abdellah_madani@yahoo.fr 41
Traduction des associations en Relationnel
(Association plusieurs-à-plusieurs)
En SQL
1. create table Article(Ref integer primary key, …)
abdellah_madani@yahoo.fr 42
OCL
43
Contraintes
44
Contraintes
45
Contraintes – Exemple -
46
Contraintes – Exemple -
47
Introduction
48
Contexte
49
Contexte
Syntaxe
context <élément>
Où : <élément> : peut être une classe, un attribut,
une opération, etc.
Pour faire référence à un élément d’une
classe, il faut utiliser les ‘::’
50
Contexte
51
Invariants
52
Invariants
Exemple :
Le solde d’un compte doit être toujours positif
context Compte
inv : solde>0
53
Préconditions et postconditions
54
Préconditions et postconditions
55
Préconditions et postconditions
Syntaxe de la précondition
pre : <expression logique>
Syntaxe de la postcondition
post : <expression logique>
56
Préconditions et postconditions
Exemples :
context Compte::debiter(somme : Real)
pre : somme>0
post : solde=solde@pre-somme
context Compte::getSolde():Real
post : result=solde
57
Résultat d’une opération
58
Résultat d’une opération
Exemple
La méthode getSolde() de la classe ‘Compte’
retourne le solde actuel
context Compte::getSolde():Real
body : solde
59
Définition des attributs et de méthodes
Motivation :
une sous expression peut être utilisée plusieurs fois dans
une expression
Deux expressions de contraintes :
let : permet de déclarer et d’initialiser un attribut qui peut
être utilisé dans l’expression qui suit le mot clé in
def : fait la même chose que let.
60
Définition des attributs et de méthodes
Syntaxes :
let <déclaration>=<requête> in <expression>
def : <déclaration>=<requête>
61
Définition des attributs et de méthodes
Exemples
1. context Personne
inv : let argent=compte.solde->sum() in
age>=18 implies argent>0
2. context Personne
def : argent : Real = compte.solde-
>sum()
3. context Personne
inv : age>=18 implies argent>0
62
Initialisation et évolution des attributs
63
Initialisation et évolution des attributs
Exemple
Quand on crée une personne, la valeur initiale
de l’attribut marié est faux, et la personne ne
possède pas d’employeur.
context Personne::marié:Boolean
init : false
context Personne::employeur:Set(Société)
init : set{}
64
Initialisation et évolution des attributs
Exemple
L’âge d’une personne est la différence entre la
date courante et la date de naissance de la
personne.
context Personne::age:Integer
derive : Date::current() – date_de_naissance
65
Types et opération OCL
66
Types et opération OCL
Type opérateurs
67
Types et opération OCL
V V V V F V
V F F V V F
F V F V V V
F F F F F V
68
Types et opération OCL
not If <exp_log0>
Then <exp_log1>
V F
Else <exp_log2>
Endif
F V
69
Collections
70
Collections
71
Quelques opérations sur les collections
- Opération de base -
La syntaxe : collection->operation()
size() : nombre d’éléments
count() : nombre d’occurrences
sum() : somme des éléments
isEmpty() : est vide
notEmpty() : non vide
includes(el) : appartenance
excludes(el) : non appartenance
includesAll(col) : inclusion
excludesAll(col) : exclusion
72
Quelques opérations sur les collections
- Filtrage -
select(cond) : retient les éléments qui vérifient la condition
reject(cond) : élimine les éléments qui vérifient la condition
any(cond) : retourne l’un des éléments qui vérifie la
condition
forAll(cond) : true si tous les éléments vérifient la
condition
exists(cond) : true si au moins un élément vérifie la
condition
isUnique(exp) : true si une et une seule valeur de la
collection qui vérifie la condition
73
Opération ensembliste
- Set ou OrederedSet -
union(ens) : union
- : différence (ens1 – ens2)
including(el) : ajoute un élément
excluding(el) : retire un élément
74
Accès aux données de l’objet courant
75
Accès aux données de l’objet courant
Exemple
Dans le contexte de la classe ‘Compte’ :
Context Compte
Inv : solde > 0
77
Navigation à travers une association
78
Navigation à travers une association
Exemple
L’adresse de la société employant une
personne est constituée d’au moins 10
caractères
Context Personne
Inv: employeur.adresse.size()>=10
Ou encore
Context Personne
Inv: société.adresse.size()>=10
79
Navigation à travers une association
80
Navigation à travers une association
Exemple
Dans le contexte de la classe Avion :
pilote->size()>0 and pilote->size()<5
passager->size()>40
Dans le contexte de la classe Personne
epoux.age>=18
epouse.age>=20
81
Navigation à travers une association
82
Navigation à travers une association
83
Navigation à travers une association
qualifiée
Dans une association qualifiée, on utilise les
valeurs des qualificatifs entre crochets ([])
context Banque
inv : self.compte[8900].solde>0
84
Navigation vers une classe association
Dans le contexte de Société, self.poste.salaire:
salaire de tous les employés
Dans le contexte de Personne,
self.mariage[epouse].date : dates de mariages
des femmes
85
Navigation depuis une classe association
context Poste
inv : self.employe.age>21
(ou aussi, self.personne.age>21)
86