Académique Documents
Professionnel Documents
Culture Documents
Cédric Buche
28 janvier 2014
1 Diagramme d’états-transitions
2 Diagramme d’activités
3 Génération de code
Définitions — rôles
Machine à états :
le comportement ne dépend pas uniquement des entrées du
système, mais aussi de son histoire , son état interne
Définitions — rôles
Machine à états :
le comportement ne dépend pas uniquement des entrées du
système, mais aussi de son histoire , son état interne
Définitions — rôles
Machine à états :
le comportement ne dépend pas uniquement des entrées du
système, mais aussi de son histoire , son état interne
Définitions — rôles
Machine à états :
le comportement ne dépend pas uniquement des entrées du
système, mais aussi de son histoire , son état interne
Eteint
pression pression
Allumé
Concepts de base
Concepts de base
État — définitions
Pseudo-état :
non observable, généralement de durée nulle
rôle : contrôle des activations des états
État composite
peut contenir (envelopper) des sous-états
État — notations
NomEtat
NomEtat
TransitionInterne1 optionnel
Super−état décomposé en
Machine à état une machine à état
Pseudo–états
Caractérisent l’activation (initiale ou terminale) d’une région d’un
état englobant
État final :
Indique que l’activation de la région englobante est terminée
Aucun autre état n’est alors activable
Transition : pas de restriction
Pseudo–états
Caractérisent l’activation (initiale ou terminale) d’une région d’un
état englobant
État final :
Indique que l’activation de la région englobante est terminée
Aucun autre état n’est alors activable
Transition : pas de restriction
Pseudo–états
Caractérisent l’activation (initiale ou terminale) d’une région d’un
état englobant
État final :
Indique que l’activation de la région englobante est terminée
Aucun autre état n’est alors activable
Transition : pas de restriction
Transition — définition
Transition — déclenchement
Etat source
Ei
Etat cible
Ej
Franchissement
transition
(déclenchement)
Transition — déclenchement
Etat source
Ei
Etat cible
Ej
Franchissement
transition
(déclenchement)
Transition — déclenchement
Etat source
Ei
Etat cible
Ej
Franchissement
transition
(déclenchement)
Transition — déclenchement
Etat source
Ei
Etat cible
Ej
Franchissement
transition
(déclenchement)
Événement — définition
nomEvenement(liste_parametres)
E1 E2
Stéréotype de classifier
Transition d’achèvement
Transition d’achèvement
expression logique sur les attributs de l’objet, ainsi que sur les
paramètres de l’événement déclencheur
[expression garde]
E1 E2
expression logique sur les attributs de l’objet, ainsi que sur les
paramètres de l’événement déclencheur
[expression garde]
E1 E2
/ expression activité
E1 E2
/ expression activité
E1 E2
/ expression activité
E1 E2
evenement(params)[cond]/activite
E0 E1
after(2s)/selectionner(defaut)
selection(item)/traiter(item)
E2 E3
when(x>0)[y>0]
E4 E5
stm1 stm3
E1 E3 /init
E2 E6
evtZ
stm2
[cond1] evtX/a1 E7
E4
E5
[else] evtY/a2
Occurrences d’événements
Sémantique des machines à états – cas simples
Occurrences d’événements
Sémantique des machines à états – cas simples
Occurrences d’événements
Sémantique des machines à états – cas simples
Occurrences d’événements
Sémantique des machines à états – cas simples
Occurrences d’événements
Sémantique des machines à états – cas simples
Activités internes
Activités internes
Activités internes
Activités internes
Activités internes
Transitions internes
[cond2]/a2
E2
evtX[cond1]/a1
E1
[!cond2 & cond3]/a3
E4
[else]/a4 [cond4]
Définitions
Parallélisme = concurrence :
évolutions indépendantes de différents éléments
Région
Ensemble d’états et de transitions
1 transition peut avoir un état source ou cible traversant
l’état composite
par déf., aucune transition entre états de régions orthogonales
1 et 1 seul état actif par région (si état composite englobant actif)
Définitions
Parallélisme = concurrence :
évolutions indépendantes de différents éléments
Région
Ensemble d’états et de transitions
1 transition peut avoir un état source ou cible traversant
l’état composite
par déf., aucune transition entre états de régions orthogonales
1 et 1 seul état actif par région (si état composite englobant actif)
E2
EA1 EA2
E1
EC1 EC2
E3
Transitions complexes
débranchement et jointure
E2
EA1 EA2
E1
evtY
EB1 EB2 EB3
evtX
EC1 EC2
E3
Hiérarchie : modélisation
Ek
Ei Ek1
Ej Ek
Ek2
E2
E2B
E2Bi E2Bk
E1 E3
Hiérarchie : historique
E1 E2 E3
C1 C2
H H B1 C1a C2a
C1b C2b
A1 A2
B2
H*
C1
C0
A0 A3 A4 B0 B3 B4
Représentations graphiques :
point d’entrée : cercle vide ◦ N
point de sortie : cercle avec une croix
Ek
sortie_A
EA EB
E1 E2
X/d E2a
E1a /e
exit/c entry/h
entry/j E2b
exit/i Y/k
entry/a entry/f
exit/b exit/g
Ei Ej
Z/m /n /r
Ei1 Ej1
Expertise métier :
certains états fondamentaux font partie du vocabulaire des experts
1 Diagramme d’états-transitions
2 Diagramme d’activités
3 Génération de code
Objectifs du modèle
Le modèle des activités – activity chart
Objectifs du modèle
Le modèle des activités – activity chart
Objectifs du modèle
Le modèle des activités – activity chart
Éléments de modélisation
Nœud de contrôle
Activité : définition
Activités : notation
Action : définition
Action : définition
Action : définition
Action : définition
Action : propriétés
Action : propriétés
Action : propriétés
accept event :
son exécution bloque le flot d’exécution
tant qu’un événement n’est pas détecté,
généralement un type de signal
send signal :
création d’un message et transmission de ce signal
au destinataire
accept event :
son exécution bloque le flot d’exécution
tant qu’un événement n’est pas détecté,
généralement un type de signal
send signal :
création d’un message et transmission de ce signal
au destinataire
accept event :
son exécution bloque le flot d’exécution
tant qu’un événement n’est pas détecté,
généralement un type de signal
send signal :
création d’un message et transmission de ce signal
au destinataire
Pins : Notations
Entrée, sortie, exception
nomVar: Type
Activité A Activité B
nomPinEntrée nomPinSortie result: CA
x: integer
indexOutOfBoundException
nomPinEntrée
Activité C elementAt
{stream} i: integer o: Object
Définition
Flot de contrôle : description des séquences d’exécution des
activités
Flot de données : passage d’une information produite par une
activité à une activité qui la consomme
Définition
Flot de contrôle : description des séquences d’exécution des
activités
Flot de données : passage d’une information produite par une
activité à une activité qui la consomme
Propriétés
instance d’un classifier (obligatoire)
Activité A Activité B
:Type :Type
{create}
Préparer support Imprimer
cours [numérique]
{create}
support
[papier]
Nœuds de contrôle
Nœud initial
indique la première activité à réaliser :
initialisation du flot de contrôle
notation : idem état–transition
Nœud final
Activité (activity final node) :
indique que le flot de contrôle est terminé :
Tous les flots sont alors désactivés
notation : idem état–transition
Nœud initial
indique la première activité à réaliser :
initialisation du flot de contrôle
notation : idem état–transition
Nœud final
Activité (activity final node) :
indique que le flot de contrôle est terminé :
Tous les flots sont alors désactivés
notation : idem état–transition
Nœud de décision
Choix exclusif entre plusieurs membres d’une alternative
1 arc entrant et plusieurs arcs sortants (1 par choix)
1 DecisionInput ≡ règle de décision
Chaque arc sortant correspond à une valeur possible
de decision input (ou [else])
expression du même type que DecisionInput
Dans un modèle bien formé, l’alternative couvre tous les cas
Nœud de décision
Choix exclusif entre plusieurs membres d’une alternative
1 arc entrant et plusieurs arcs sortants (1 par choix)
1 DecisionInput ≡ règle de décision
Chaque arc sortant correspond à une valeur possible
de decision input (ou [else])
expression du même type que DecisionInput
Dans un modèle bien formé, l’alternative couvre tous les cas
Nœud de décision
Choix exclusif entre plusieurs membres d’une alternative
1 arc entrant et plusieurs arcs sortants (1 par choix)
1 DecisionInput ≡ règle de décision
Chaque arc sortant correspond à une valeur possible
de decision input (ou [else])
expression du même type que DecisionInput
Dans un modèle bien formé, l’alternative couvre tous les cas
<<decisionInput>>
! = b2 ! 4ac
!
!
activity
Traiter
Exception1
nomException1
Traiter
nomException2 Exception2
anomalie
Activite1 Activite2
Région d’expansion
Exécution d’une activité sur les éléments d’une collection
<<parallel>>
x: real
o: CA
Activite1
Activite2
n: integer[]
Modes d’exécution :
parallel : de manière indépendante
iterative : nécéssairement en séquence
si collection ordonnée, alors dans l’ordre
streaming : une exécution unique pour tous les éléments de la
collection
Modes d’exécution :
parallel : de manière indépendante
iterative : nécéssairement en séquence
si collection ordonnée, alors dans l’ordre
streaming : une exécution unique pour tous les éléments de la
collection
TYPE T
nomActivité
i: integer
x: T i++
[i<n]
i=0 f(x[i])
[else]
n: integer
ActA1 ActB1
ActC1
ObjX ActB2
ActB3
ActB4
1 Diagramme d’états-transitions
2 Diagramme d’activités
3 Génération de code
Problématique :
UML est indépendant des langages de programmation
et des technologies
Package UML
Package UML
UML Java
package Catalogue
...
C++
namespace Catalogue
{
...
}
Cas particuliers
Classe abstraite
Java :
public abstract class AA { ... }
C++ :
au moins une opération abstraite
Interface :
Java :
public interface IJ { ... }
C++ :
classe dont toutes les opérations sont abstraites
Cas particuliers
Classe abstraite
Java :
public abstract class AA { ... }
C++ :
au moins une opération abstraite
Interface :
Java :
public interface IJ { ... }
C++ :
classe dont toutes les opérations sont abstraites
Operation vs Method
Operation : spécification du service (déclaration)
Method : définition de l’opération
Une Operation sans Method associée est abstraite
Paramètres :
Type : voir traduction des types de base
Direction : in, out, inout, return
— {wrapped}
— int Integer
{size,long} long Long
{size,short} short Short
{size,byte} byte Byte
— {wrapped}
— float Float
{size,long} double Double
— {wrapped}
boolean Boolean
type string
String
— {wrapped}
char Character
— {unsigned}
— int unsigned int
{size,long} long unsigned long
{size,extraLong} long long unsigned long long
{size,short} short unsigned short
— float
{size,long} double
{size,extraLong} long double
type boolean :
bool
type string :
string
#include <string>
type char :
char
Principe de transformation :
implémentation non accessible en dehors de la classe
acccessibilité (lecture, modification) assurée par des méthodes dont
l’accessibilité correspond à la visibilité du modèle de classe
Invariant :
maintien de l’intégrité des valeurs attributs
class CName {
protected :
inline AttrType getAttrName(void) const ;
inline void setAttrName(AttrType value) ;
inline virtual void invariant(void) ;
private :
AttrType attrName ;
};
inline AttrType CName : :getAttrName(void) const {
return attrName ;
}
inline void CName : :setAttrName(AttrType value) }
attrName = value ;
invariant() ;
}
inline void CName : : invariant(void) {
// Begin
// End
}
Cédric Buche (ENIB) MIS 28 janvier 2014 95 / 152
Génération de code Diagramme de classes
class CName {
protected :
inline AttrType getAttrName(void) const ;
inline void setAttrName(AttrType value) ;
inline virtual void invariant(void) ;
private :
AttrType attrName ;
};
inline AttrType CName : :getAttrName(void) const {
return attrName ;
}
inline void CName : :setAttrName(AttrType value) }
attrName = value ;
invariant() ;
}
inline void CName : : invariant(void) {
// Begin
// End
}
Cédric Buche (ENIB) MIS 28 janvier 2014 95 / 152
Génération de code Diagramme de classes
class CName {
protected :
inline AttrType getAttrName(void) const ;
inline void setAttrName(AttrType value) ;
inline virtual void invariant(void) ;
private :
AttrType attrName ;
};
inline AttrType CName : :getAttrName(void) const {
return attrName ;
}
inline void CName : :setAttrName(AttrType value) }
attrName = value ;
invariant() ;
}
inline void CName : : invariant(void) {
// Begin
// End
}
Cédric Buche (ENIB) MIS 28 janvier 2014 95 / 152
Génération de code Diagramme de classes
public Plant(...) {
this(..., 0.01 /* initial value of growthRate */) ;
}
+position: real[2]
+position: real[2]
Masquage de l’implémentation
wrapper :
public double getPosition(int index) {
return position.elementAt(index) ;
}
public void setPosition(int index, double value) {
position.set(index, value) ;
}
type de base :
public double getPosition(int index) {
return position[index] ;
}
void setPosition(int index, double value) {
position[index] = value ;
}
Cédric Buche (ENIB) MIS 28 janvier 2014 101 / 152
Génération de code Diagramme de classes
Masquage de l’implémentation
wrapper :
public double getPosition(int index) {
return position.elementAt(index) ;
}
public void setPosition(int index, double value) {
position.set(index, value) ;
}
type de base :
public double getPosition(int index) {
return position[index] ;
}
void setPosition(int index, double value) {
position[index] = value ;
}
Cédric Buche (ENIB) MIS 28 janvier 2014 101 / 152
Génération de code Diagramme de classes
Constructeurs implicites :
nom de la méthode : nom de la classe
valeurs initiales des attributs
construction des conteneurs pour l’implémentation des attributs à
valeurs multiples et des associations de multiplicité > 1
action(s) des états initiaux (cf. modèle état–transition)
Cohérence des constructeurs
Constructeurs explicites :
Operation stéréotypée create
package simLife ;
public Clock() {
this(0.0, 1.0, Double.MAX VALUE) ;
}
type
visibility
ownerScope
multiplicity
ordering
changeability
aggregation
Multiplicity = 0..1
class CName1 {
public :
inline virtual const CName2 ∗ getRoleName(void) const ;
inline virtual void setRoleName(CName2 ∗ instance) ;
private :
CName2 ∗ roleName ;
};
inline const CName2 ∗ CName1 : :getRoleName(void) const {
return roleName ;
}
inline void CName1 : :setRoleName(CName2 ∗ instance) {
if (getRoleName() != instance) {
roleName = instance ; invariant() ;
}
}
Multiplicity = 0..1
class CName1 {
public :
inline virtual const CName2 ∗ getRoleName(void) const ;
inline virtual void setRoleName(CName2 ∗ instance) ;
private :
CName2 ∗ roleName ;
};
inline const CName2 ∗ CName1 : :getRoleName(void) const {
return roleName ;
}
inline void CName1 : :setRoleName(CName2 ∗ instance) {
if (getRoleName() != instance) {
roleName = instance ; invariant() ;
}
}
Multiplicity = 0..1
class CName1 {
public :
inline virtual const CName2 ∗ getRoleName(void) const ;
inline virtual void setRoleName(CName2 ∗ instance) ;
private :
CName2 ∗ roleName ;
};
inline const CName2 ∗ CName1 : :getRoleName(void) const {
return roleName ;
}
inline void CName1 : :setRoleName(CName2 ∗ instance) {
if (getRoleName() != instance) {
roleName = instance ; invariant() ;
}
}
class CName1 {
public :
// — Global access to the set of instances ’roleName’
inline virtual const set < CName2 ∗ > & getRoleName(void) const ;
inline virtual void setRoleName(const set < CName2 ∗ > & setOfInstance) ;
// — Add/remove one instance in/from ’roleName’
inline virtual bool addToRoleName(CName2 & instance) ;
inline virtual bool removeFromRoleName(CName2 & instance) ;
// — Get information about the set ’roleName’
inline virtual bool hasInRoleName(const CName2 & instance) const ;
inline virtual unsigned int cardOfRoleName(void) const ;
// — Hidden implemention of ’roleName’
private :
set < CName2 ∗ > roleName ;
};
class CName1 {
public :
// — Global access to the set of instances ’roleName’
inline virtual const set < CName2 ∗ > & getRoleName(void) const ;
inline virtual void setRoleName(const set < CName2 ∗ > & setOfInstance) ;
// — Add/remove one instance in/from ’roleName’
inline virtual bool addToRoleName(CName2 & instance) ;
inline virtual bool removeFromRoleName(CName2 & instance) ;
// — Get information about the set ’roleName’
inline virtual bool hasInRoleName(const CName2 & instance) const ;
inline virtual unsigned int cardOfRoleName(void) const ;
// — Hidden implemention of ’roleName’
private :
set < CName2 ∗ > roleName ;
};
class CName1 {
public :
// — Global access to the set of instances ’roleName’
inline virtual const set < CName2 ∗ > & getRoleName(void) const ;
inline virtual void setRoleName(const set < CName2 ∗ > & setOfInstance) ;
// — Add/remove one instance in/from ’roleName’
inline virtual bool addToRoleName(CName2 & instance) ;
inline virtual bool removeFromRoleName(CName2 & instance) ;
// — Get information about the set ’roleName’
inline virtual bool hasInRoleName(const CName2 & instance) const ;
inline virtual unsigned int cardOfRoleName(void) const ;
// — Hidden implemention of ’roleName’
private :
set < CName2 ∗ > roleName ;
};
class CName1 {
public :
// — Global access to the set of instances ’roleName’
inline virtual const set < CName2 ∗ > & getRoleName(void) const ;
inline virtual void setRoleName(const set < CName2 ∗ > & setOfInstance) ;
// — Add/remove one instance in/from ’roleName’
inline virtual bool addToRoleName(CName2 & instance) ;
inline virtual bool removeFromRoleName(CName2 & instance) ;
// — Get information about the set ’roleName’
inline virtual bool hasInRoleName(const CName2 & instance) const ;
inline virtual unsigned int cardOfRoleName(void) const ;
// — Hidden implemention of ’roleName’
private :
set < CName2 ∗ > roleName ;
};
class Place {
class Species {
private Set<FoodLink> preys = new HashSet<FoodLink>() ;
...
private Set<FoodLink> predators = new HashSet<FoodLink>() ;
...
}
class FoodLink {
private Species prey ;
private Species predator ;
private double preference ;
...
}
Réalisation en Java
UML Java
public class Livre implements
IImprimable, IEmpruntable {
private String titre;
private String auteur;
private ISBN isbn;
public void Imprimer(){
...
}
public void Emprunter(){
...
}
public void Retourner(){
...
}
}
Réalisation en C++
UML C++
public class Livre :
IImprimable, IEmpruntable {
private string titre;
private string auteur;
private ISBN isbn;
public void Imprimer(){
...
}
public void Emprunter(){
...
}
public void Retourner(){
...
}
}
Dépendance
UML Java
package Bibliotheque;
import catalogue;
public class Bibliotheque {
private Catalogue leCatalogue;
...
}
}
C++
namespace Bibliotheque {
using Catalogue;
public class Bibliotheque {
private Catalogue leCatalogue;
...
}
}
Agrégation
UML Java
public class Voiture {
private String modele;
private Moteur moteur;
private static class Moteur {
private int puissance;
}
... }
C++
public class Voiture {
private string modele;
private Moteur moteur;
private class Moteur {
private int puissance;
}
... }
Séquence
UML C++
public class A {
...
... leB.OperationB1();
... leB.OperationB2();
...
}
public class B {
...
public void OperationB1();
public void OperationB2();
...
}
sd simulation initialisation
strict
ref
environment creation
ref
plants creation
ref
animals creation
sd environment creation
sw: Point2D {sw.x = 0, sw.y = 0}
ne: Point2D {sw.x = 100, sw.y = 100}
:SavannaSimulator
l: real = 10
initialize()
savanna:Environment
dimension(sw, ne, l)
createCell()
Live
H* Hunting
[isHungry()] [canSeeAPrey()]
Resting Foraging
do/recover() do/lookForPrey()
[else]/moveRandomly()
Approach
[isExhausted()]
do/followPrey()
[!canSeeAPrey()]
[!isCloseToPrey()]
Attack
do/attackPrey()
[isCloseToPrey()]
Eating
do/eatPrey() [isOnThePrey()]
simulationCycle/basalActivity()
Déterministe
Modèle d’activités
Traduction du modèle en code
Sémantique
Réalisation d’activités (actions)
Structures de contrôle
Communication (asynchrone)
Gestion des exceptions
Modèle d’activités
Traduction du modèle en code
Sémantique
Réalisation d’activités (actions)
Structures de contrôle
Communication (asynchrone)
Gestion des exceptions
Modèle d’activités
Traduction du modèle en code
Sémantique
Réalisation d’activités (actions)
Structures de contrôle
Communication (asynchrone)
Gestion des exceptions
Perceive Change
conspecific position
Select Compute
nearest feasible
neighbours displacement
Compute
expected
position
v1
v1:=c.localPopulation(n)
c:Cell n
<<parallel>>
n:string
x:=distance(v1[i].position,self.position)
r:real
x
d
a:Animal[*] d
i: integer
dist:real[*] i++
[else]
d2:real[*]
[i<n]
sortByDistance i:=0 add(d2,d[i])
add(i2, i)
[else]
[d[i]<r]
i2:integer[*]
a:Animal[*] k:integer
r1:real
r2:real
g:Point2D
d0:=dist(a[0].position, self.position)
d0
[>r2] [<=r2]
p:=near(g) p:=opposite(g)
p p
p:Point2D
Avantages
Sémantique implémentable sur de nombreuses plates-formes
Spécification précise (détaillée) des algorithmes
Génération de test
Vérification possible de propriétés du modèle
(sans exécution)
Inconvénients
Lourdeur de l’écriture
Norme encore peu précise
Absence d’un langage (unifié) d’action
Avantages
Sémantique implémentable sur de nombreuses plates-formes
Spécification précise (détaillée) des algorithmes
Génération de test
Vérification possible de propriétés du modèle
(sans exécution)
Inconvénients
Lourdeur de l’écriture
Norme encore peu précise
Absence d’un langage (unifié) d’action