UML et Java

Passage d’UML à Java

MSIAG 2007-2008

UML & POO – Section 4

1

Classe / attribut / opération
Java UML
Voiture
- capaciteReservoir: int - niveauDeCarburant : int + faireLePlein() + niveauDeCarburant() : int public class Voiture { private int niveauDeCarburant; private final int capaciteReservoir; public Voiture(int capaciteReservoir) { this.capaciteReservoir = capaciteReservoir; this.niveauDeCarburant = 0; } public void faireLePlein() { niveauDeCarburant = capaciteReservoir; } public int niveauDeCarburant() { return niveauDeCarburant; } }
MSIAG 2007-2008 UML & POO – Section 4 2

UML ne précise que la déclaration et non l’implémentation des méthodes !

Association et agrégation
Equipe
0..1

est composé de
0..n

Joueur

public class Equipe { private List joueurs; public Equipe() { this. joueurs = new ArrayList(); } public void recruter(Joueur joueur) { // on ajoute le joueur à la liste this.joueurs.add(joueur); // on met à jour l’équipe du joueur joueur. nouvelleEquipe(this); } }

public class Joueur { private String nom; private Equipe equipe; public Joueur(String nom) { this. nom = nom; } public void nouvelleEquipe(Equipe nouvelleEquipe) { this.equipe = nouvelleEquipe; } }

Nécessaire parce que l’association est bidirectionnelle et que le Joueur doit pouvoir dire quelle est son équipe.
UML & POO – Section 4 3

MSIAG 2007-2008

Composition

Voiture

1

Moteur

Le langage Java ne supporte pas naturellement la notion de composition C’est au programmeur d’assurer le respect de la composition en clonant le composant avant de le retourner
public class Voiture { private Moteur moteur; public Voiture(Moteur moteur) { this.moteur = moteur; } public Moteur getMoteur() { return moteur.cloneMoteur(); } }
MSIAG 2007-2008

public class Moteur { private int chevauxFiscaux; public Moteur(Moteur moteurADupliquer) { // on clone moteurADupliquer chevauxFiscaux = moteurADupliquer.chevauxFiscaux; } public Moteur cloneMoteur() { return new Moteur(this); } }
UML & POO – Section 4 4

Classe d’associations (1/2)

Employe
0..*

connait
1..*

Domaine

Competence
niveau

Pour une instance d’Employe et une instance de Domaine donné il n’y a qu’une instance de Competence Un employé peut connaître plusieurs domaines et a donc autant de compétences que de domaines connus (par lui).

MSIAG 2007-2008

UML & POO – Section 4

5

Classe d’associations (2/2)
public class Employe { private static final int NIVEAU_1 = 1; private Map competences = new HashMap(); public int niveauDans(Domaine domaine) { Competence competence = getCompetence(domaine); return competence.getNiveau(); } public boolean estCompetentDans(Domaine domaine) { return (competences.get(domaine) == null); } public void suivreUneFormation(Domaine domaine) { if (estCompetentDans(domaine)) { augmenterEnCompetence(domaine); } else { gagnerUneCompetence(domaine); } } // to be continued …
MSIAG 2007-2008

// … suite et fin private void augmenterEnCompetence(Domaine domaine) { Competence competence = getCompetence(domaine); int niveauAvantFormation = competence.getNiveau(); competence.setNiveau(niveauAvantFormation + 1); } private void gagnerUneCompetence(Domaine domaine) { Competence nouvelleCompetence = new Competence(domaine); nouvelleCompetence.setNiveau(NIVEAU_1); competences.put(domaine, nouvelleCompetence); } private Competence getCompetence(Domaine domaine) { return (Competence) competences.get(domaine); } } // fin de la classe
6

UML & POO – Section 4

Héritage

UML
Personne
- nom - prenom + donnerSonIdentité()

public class Personne { private String nom, prenom; public Personne (String nom, String prenom) { this.nom = nom; this.prenom = prenom; } public String donnerSonIdentite() { return prenom + " " + nom; } }

Employe
- ancienneté + primeAnciennete()

public class Employe extends Personne { private int anciennete; public Employe (String nom, String prenom, int anciennete) { super(nom, prenom); this.anciennete = anciennete; } public double primeAnciennete() { return anciennete*100.0; } }
UML & POO – Section 4 7

MSIAG 2007-2008

Implémentation d’interface

public interface ServiceAdresse { public String chercherAdresse(String nom); }

public class ServiceAdresseLDAP implements ServiceAdresse { public String chercherAdresse(String nom) { ldap.lookForAdressesOf(nom); // on suppose que ldap a été correctement initialisé avant… } } public class ServiceAdresseJDBC implements ServiceAdresse { public String chercherAdresse(String nom) { // on suppose que dataBase a été correctement initialisé avant… return dataBase.querySQL("select libelle_adresse from table_adresse where habitant = nom" ); } }
MSIAG 2007-2008 UML & POO – Section 4 8

Diagramme de séquence

Recherche d’employés par domaine et niveau de compétence
: ProfilService : Departement : Employe iteration sur tous les employes du département

: Commercial

1: rechercheParProfilDeCompetence(domaine, niveau) 2: getListeEmployesCompetent(domaine, niveau)

3: estSuffisamentCompetentPour(domaine, niveau) 4: [est compétent] : ajouter à la liste des employés compétent 5: liste employés compétent 6: liste employés compétent

MSIAG 2007-2008

UML & POO – Section 4

9

Diagramme de séquence
public class ProfilService { private Departement departement; public Employe[] rechercheParProfilDeCompetence(Domaine d, int niveau) { return departement.getListeEmployesCompetent(d, niveau); } }

Correspond au message 2

public class Departement { private Employe[] employes; public Employe[] getListeEmployesCompetent(domaine d, int niveau) { ArrayList employesCompetents = new ArrayList(); for(int i=0 ; i<employes.length; i++) { Correspond au message 3 if (employes[i].estSuffisamentCompetentPour(d, niveau)) { employesCompetents.add(employes[i]); } } return employesCompetents.toArray(new Employe[] {}); // conversion en Employe[] } }
MSIAG 2007-2008 UML & POO – Section 4 10