• Aucun résultat trouvé

InterludeDe la conception à la programmation,exemples avec Java UML

N/A
N/A
Protected

Academic year: 2022

Partager "InterludeDe la conception à la programmation,exemples avec Java UML"

Copied!
12
0
0

Texte intégral

(1)

UML

Interlude

De la conception à la programmation, exemples avec Java

Polytech Paris-Sud

Formation initiale 3

e

année Spécialité Informatique Année 2016-2017

Delphine Longuet

delphine.longuet@lri.fr

(2)

De la conception à la programmation

Objectif : Obtenir un squelette du programme à partir du diagramme de classes conception.

Peut être fait en deux étapes :

1. Raffiner le diagramme de classes en un ensemble de classes (plus d'associations)

2. Implémenter chaque classe dans le langage de programmation choisi Séparation des problèmes :

1. Association concrétisée en attribut, classe, opération ?

2. Détails d'implémentation et contraintes du langage choisi

(3)

Correspondances UML/Java

UML Java

Classe du diagramme class

Héritage extends

Classe/opération abstraite abstract

Interface interface

Redéfinition @Override

Association (multiplicité, navigabilité...) ?

Classe-association ?

Composition ?

Agrégation ?

Dans la suite : aucune règle générale, seulement des exemples En pratique : chaque cas demande réflexion et traitement ad-hoc

!

(4)

Héritage et redéfinition

Compte

retirer(montant : float) numéro : int

devise : Devise solde : float

CompteCourant frais : float

retirer(montant : float)

public class CompteCourant extends Compte { private float frais;

@Override

public void retirer(float montant) { if(solde - montant >= 0) {

solde = solde - montant;

} else {

solde = solde – montant - frais;

}

return;

public class Compte { private int numero;

private Devise devise;

private float solde;

public void retirer(float montant) { if(solde - montant >= 0) {

solde = solde - montant;

}

return;

}

}

(5)

Classes et opérations abstraites

Forme surface() : float nom : string

Rectangle

surface() : float longueur : float largeur : float

public abstract class Forme { private String nom;

public abstract float surface();

}

public class Rectangle extends Forme { private float longueur;

private float largeur;

public float surface() {

return (longueur * largeur);

}

}

(6)

Interfaces

« interface » Comparable égal(Object o) : boolean supérieur(Object o) : boolean

Point

égal(Object o) : boolean supérieur(Object o) : boolean abs : float

ord : float

public interface Comparable {

public boolean egal(Object o);

public boolean superieur(Object o);

}

public class Point implements Comparable { private float abs;

private float ord;

@Override

public boolean egal(Object o) { Point p = (Point) o;

return (this.abs == p.abs

&& this.ord == p.ord);

}

@Override

public boolean superieur(Object o) { Point p = (Point) o;

return (this.abs >= p.abs

&& this.ord >= p.ord);

}

(7)

Associations

Compte numéro : int devise : Devise solde : float Client

nom : string naissance : Date

1..*

1 comptes

proprio

public class Compte { private int numero;

private Devise devise;

private float solde;

private Client proprio;

} public class Client {

private Sring nom;

private Date naissance;

private Set<Comptes> comptes;

}

Set = tableau, ArrayList, HashSet... en fonction de l'utilisation prévue de cet attribut

(complexité du parcours de la structure, de la recherche, de l'insertion, nombre d'éléments

maximum...)

(8)

Associations, pseudo-règles

1

* 0..1 1..*

A B

A B

A B

A B

public class A {

private B roleB;

}

roleB roleB roleB roleB

public class A {

private Set<B> roleB;

}

Si pas de B, roleB = null

Si pas de B, roleB.isEmpty() = true

A B public class A {

// pas d'accès possible à B

}

(9)

Classes-associations (1)

Pizza id : int nom : string Commande

numero : int * 1..*

pizzas commandes

Quantité qte : int

public class Pizza { private int id;

private String nom;

private Set<Commande> commandes;

// ou bien

private Map<Commande,Integer> commandes;

} public class Commande {

private int numero;

private Map<Pizza,Integer> pizzas;

}

Ou même, pas navigable dans ce sens-là

(De quelles informations a-t-on réellement besoin ?) On peut choisir autre chose que Map

Contrainte d'unicité sur les pizzas pour

en faire des clés

(10)

Classes-associations (2)

Exemplaire code : int

Emprunteur

nom : string 0..1 *

emprunts emprunteur

Emprunt retour : Date

public class Exemplaire { private int code;

private Emprunteur emprunteur;

private Date retour;

} public class Emprunteur {

private String nom;

private Map<Exemplaire,Date> emprunts;

}

Contrainte d'unicité sur les exemplaires

pour pouvoir en faire une clé de la Map Contrainte emprunteur == null

ssi retour == null

ou bien une classe Pair

(11)

Classes-associations (2)

public class Emprunt { private Date retour;

private Emprunteur emprunteur;

private Exemplaire exemplaire;

}

public class Exemplaire { private int code;

private Emprunt emprunt;

} public class Emprunteur {

private String nom;

private Set<Emprunts> emprunts;

}

Exemplaire Emprunteur emprunteur * Emprunt 0..1 exemplaire

Exemplaire code : int

Emprunteur

nom : string 0..1 *

emprunts emprunteur

Emprunt retour : Date

Ce qui correspond finalement à l'interprétation de la classe-association où Emprunt est une classe à part entière

Si peu de couples (Emprunteur,Exemplaire), recherche fastidieuse des exemplaires sortis, depuis Exemplaire comme depuis Emprunteur

Un solution : une classe Emprunt qui regroupe ces couples

(12)

Agrégation et composition

ListeLecture * 1..* Morceau 1..* 1 Album

listes morceaux morceaux album

public class ListeLecture {

private ArrayList<Morceau> morceaux;

public ListeLecture() {

morceaux = new ArrayList<Morceau>();

}

public void add(Morceau m) { this.morceaux.add(m);

} }

public class Album { private String nom;

private String artiste;

private ArrayList<Morceau> morceaux;

public Album(String artiste,String nom,Morceau m) { ...

this.morceaux = new ArrayList<Morceau>();

this.add(m);

}

public void add(Morceau m) { this.morceaux.add(m);

} public class Morceau { }

private String titre;

private Album album;

private Set<ListeLecture> listes;

public Morceau(String titre,String artiste,String nom_album) { ...

if(...) { // si l'album existe this.album = a;

a.add(this);

} // sinon on le crée avec ce morceau

Références

Documents relatifs

9 In that sense, we consider that the statement of N. Calder [1996: 995-6, quoted by Messick, this volume], according to whom, whereas fiqh does not dominate society as it once

For example, the financial impact of construction risks are generally limited to the pre-completion period and the early years of the project; operating, demand

Business Partners for Development, Enduring Myths, Enduring Truths Enabling Partnerships Between Business, Civil Society and the Public Sector, available at

Institution nameProductGeographySectorInvestment sizeOther details type Inter-AmericanDebtBorrowing All sectorsMaximum: US$200mUS$ or local currency denominated, at market

Variable Renegotiated Road sector Railway sector Security sector First renegotiation Years since previous renegotiation years Concession age years Investment log of M€ Contract

Cases also exist in which eradication arises on some properties, but not on others; we refer to this as “partial eradication.” For example, if property i has high marginal damage from

If the marginal dynamic cost inflicted by the stock is low, neither the sole owner nor the non-cooperative private property owners will engage in much control, so little is to be

The first term denotes a typical free-riding issue: an increase of agent j’s provision reduces agent i’s incentive to contribute; except that the second term