Analyse et conception Cours de 1e année ingénieur fabien.romeo@fromeo.fr http:/
Analyse et conception Cours de 1e année ingénieur fabien.romeo@fromeo.fr http://www.fromeo.fr Mapping UML - JAVA fabien.romeo@fromeo.fr 3 Plan • Introduction – Mapping UML-Java – Génération de code vs. reverse engineering (outils) • UML et Java : concepts OO – Classe, classe abstraite, interface, héritage, … • Attributs et getter&setter – Mapping UML-Java : pas forcément uniforme dans les 2 sens – Setter -> Contraintes OCL • Associations – Pas de concept d’association en Java – 1-1 ; 1-* ; qualifier ; classe d’association • Composition et agrégation • Diagramme de séquences • Machine à états fabien.romeo@fromeo.fr 4 Introduction • Mapping UML – Java – à la main (1e année) : passage de la conception à l’implémentation – utilisation d’outils (2e année MDA/IDM) UML Java Génération de code Rétro-ingénierie • Génération de code – Plusieurs choix de mapping possibles (plusieurs interprétations) • Rétro-ingénierie – Le modèle retrouvé peut ne pas être identique au modèle de départ UML Java Implémentation Test fabien.romeo@fromeo.fr 5 UML et Java • UML = conception orientée objet • Java = programmation orientée objet • UML n’est pas lié à un langage de programmation en particulier et n’impose même pas d’utiliser un langage orienté objet • Parce qu’ils sont orientés objets, UML et Java ont des concepts en commun qui facilitent le mapping – Classe, classe abstraite, interface, héritage, … • Mais tous les concepts d’UML ne se retrouve pas forcément dans Java fabien.romeo@fromeo.fr 6 UML et Java (classes) A AbstractA public class A { } public abstract class AbstractA { } A B public class B extends A { } fabien.romeo@fromeo.fr 7 UML et Java (interfaces) IA <<interface>> public interface IA { } A IA <<interface>> A IA public class A implements IA { } IA <<interface>> IB <<interface>> ou public interface IB extends IA { } fabien.romeo@fromeo.fr 8 Attributs et getter&setter Person +firstname +lastname +age Person -firstname -lastname -age +getFirstname() +setFirstname() +getLastname() +setLastname() +getAge() +setAge() public class Person { public String firstname; public String lastname; public int age; } public class Person { private String firstname; private String lastname; private int age; public String getFirstname() { return this.firstname; } public void setFirstname(String firstname) { this.firstname = firstname; } // ... } fabien.romeo@fromeo.fr 9 Attributs et getter&setter et OCL Person +firstname +lastname +age public class Person { private String firstname; private String lastname; private int age; public int getAge() { return this.age; } public void setAge(int age) { if(age >= 0) { this.age = age; } else { throw new InvalidAgeException(); } } // ... } { context Person inv: age >= 0 } fabien.romeo@fromeo.fr 10 Association • Le concept d’association d’UML n’existe pas en Java public class A association B { //??? } B A 1 fabien.romeo@fromeo.fr 11 UML sans association • Un modèle UML utilisant des associations peut se traduire en un modèle sans association • Le mapping vers Java peut alors s’effectuer B A 1 A -b: B B public class A { private B b; } public class B { } fabien.romeo@fromeo.fr 12 Association avec rôle • Même convention qu’en OCL, – quand il n’y a pas de rôle : nom de la classe avec première lettre en minuscule – quand il y a un rôle : nom du rôle B public class A { private B role; } public class B { } B A +role 1 A -role: B fabien.romeo@fromeo.fr 13 Associations et cardinalités B A 1 B A * B A * {ordered} public class A { private B b; } public class A { private Set<B> b; } public class A { private List<B> b; } self.b : B self.b : Set(B) self.b : OrderedSet(B) OCL OCL OCL fabien.romeo@fromeo.fr 14 Associations [1] B A 1 public class A { private B b; public A() { b = new B(); } public B getB() { return b; } } self.b : B OCL public class A { private B b; public A(B b) { this.b = b; } public B getB() { return b; } } public class A { private B b; public A() {} public setB(B b) { this.b = b; } public B getB() { return b; } } fabien.romeo@fromeo.fr 15 Associations [*] public class A { private Set<B> b; public A() { b = new HashSet<B>(); // b = new HashSet<B>(); // b = new CopyOnWriteArraySet<B>(); // b = new … implements Set<> } public boolean add(B b) { return this.b.add(b); } public boolean addAll(B... b) { return this.b.addAll(Arrays.asList(b)); } public boolean addAll(Collection<B> b) { return this.b.addAll(b); } } B A * self.b : Set(B) OCL fabien.romeo@fromeo.fr 16 Associations [*] public class A { private Set<B> b; public A(Set<B> b) { this.b = b; } public A(B... b) { this.b = new HashSet<B>(Arrays.asList(b)); } } B A * self.b : Set(B) OCL fabien.romeo@fromeo.fr 17 Associations [*] public class A { private Set<B> b; public A() { b = new HashSet<B>(); // b = new HashSet<B>(); // b = new CopyOnWriteArraySet<B>(); // b = new … implements Set<> } public Set<B> getB() { return this.b; } } B A * self.b : Set(B) OCL main() { A a = new A(); a.getB().add(new B()); a.getB().addAll(...); } fabien.romeo@fromeo.fr 18 Associations [*] {ordered} public class A { private List<B> b; public A() { b = new ArrayList<B>(); // b = new LinkedList<B>(); // b = new CopyOnWriteArrayList<B>(); // b = new … implements List<> } public List<B> getB() { return this.b; } } B A * {ordered} self.b : OrderedSet(B) OCL main() { A a = new A(); a.getB().add(new B()); a.getB().addAll(...); } fabien.romeo@fromeo.fr 19 Associations qualifiées [0..1] B A 0..1 +id : Type +id : Type A B Tuple K * +key 1 +value 1 public class A { private Map<K,B> b; } fabien.romeo@fromeo.fr 20 Associations qualifiées [*] public class A { private Map<K,Set<B>> b; } B A * +id : Type +id : Type A B Tuple K * +key 1 +value * fabien.romeo@fromeo.fr 21 Association, agrégation, composition • ToDo en TD fabien.romeo@fromeo.fr 22 Classes d’association • ToDo en TD fabien.romeo@fromeo.fr 23 Mapping Sequence Diagram - Java [Fowler2003] public class Order { public void dispatch() { for(LineItem li : lineItems) { if(product.value > 10000) { careful.dispatch(); } else { regular.dispatch(); } } if(needsConfirmation) { messenger.confirm(); } } List<LineItem> lineItems; Distributor careful; Distributor regular; Messenger messenger; boolean needsConfirmation; } fabien.romeo@fromeo.fr 24 public class MessageParser { public boolean put(char c) { switch (state) { case Waiting: if (c == '<') { state = GettingToken; token = new StringBuffer(); body = new StringBuffer(); } break; case GettingToken : if (c == '>') state = GettingBody; else token.append(c); break; case GettingBody : if (c == ';') state = Waiting; else body.append(c); return true; } return false; } public StringBuffer getToken() { return token; } public StringBuffer getBody() { return body; } private final static int Waiting = 0; private final static int GettingToken = 1; private final static int GettingBody = 2; private int state = Waiting; private StringBuffer token, body; } Mapping State Machines - Java [BRJ2005] uploads/Philosophie/ mapping-uml-java-fr 1 .pdf
Documents similaires
-
16
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Jui 22, 2022
- Catégorie Philosophy / Philo...
- Langue French
- Taille du fichier 0.1125MB