Statecharts/fr

Introduction
Le concept de Statechart qui est introduit dans VLE sous forme d'une extension est un sous-ensemble des concepts disponibles dans les machines à états d'UML (appelées aussi diagrammes dynamiques ou Statechart d'UML). Les Statecharts d'UML est une variante orientée objet des Statecharts d'Harel. Ils possèdent à la fois les caractéristiques des automates de type Moore et des automates de type Mealy. De plus, ils introduisent les notions d'actions de sortie d'état, d'actions sur événement et d'activités. Ils étendent aussi la notion d'événement d'entrée avec des événements temporisés (sur des dates ou des durées). La notion de condition (guard) apparaît sur les transitions et peut être combinée avec les événements d'entrée.

Tous les éléments des Statecharts ne sont pas proposés dans l'extension et en particulier, les suivants :
 * la hiérarchisation des états
 * les régions orthogonales de type AND ou OR

La structure
L'extension FSA::Statechart n'impose rien sur la structure du modèle. Dans la définition du modèle, il faut juste relier les transitions et les sorties aux noms de ports définis.

Les initialisations
L'extension FSA::Statechart ne nécessite aucun paramètre hormis les paramètres spécifiques au modèle utilisés lors des actions, des activités ou des sorties (voir Modèle avec des conditions).

Comment écrire un modèle à base de FSA::Statechart ?
L'écriture d'un modèle passe par la construction d'une sous-classe de vle::extension::fsa::Statechart et la définition de l'automate de type UML statechart est réalisée à l'intérieur du constructeur.

Voici un exemple de déclaration avec un automate à 3 états :

Dans cet exemple, l'automate se compose de 3 états définis par les symbole a, b et c.

Voici maintenant un exemple d'initialisation des paramètres, il ne faut pas oublier la récupération des paramètres dans le constructeur sinon les paramètres du modèle ne seront pas définis.

La deuxième étape consiste à définir et compléter le constructeur avec la définition de l'automate (les états, les transitions, les guards, les évenements, les actions, les activités et les sorties). La définition passe par l'utilisation des opérateurs < >.

Les états
La méthode state(this) << permet de déclarer la liste des états de l'automate.

L'état initial est quand à lui défini comme suit :

Les transitions
Après avoir défini les états, on peut déclarer les transitions et la relation entre transition et événement externe, condition, action et sortie. De manière générale, une transition est déclenchée sur :
 * un événement externe,
 * une condition exprimée par l'état du modèle (les guards),
 * une date,
 * une durée.

Une condition est une expression booléenne exprimée à l'aide des variables d'états de l'automate. Attention, on ne parle pas ici des états discrets de l'automate mais de variables définies au sein du modèle et qui évoluent grâce aux actions et aux activités. D'autre part, les événements externes sont définit à l'aide des ports du modèle. Il est possible de combiner les différents élements. Néanmoins, certaines combinaisons ne sont pas admises. Voici les combinaisons possibles :
 * un événement externe et une condition
 * une date (ou une durée) et une condition

Attention, il n'est pas possible d'attacher plusieurs événements ou plusieurs conditions sur une même transition.

Voici quelques exemples simples.

Dans l'exemple, on définit 2 transitions entre les 3 états a, b et c. A chaque transition, on indique le port sur lequel l'événement doit arriver. Par exemple, si l'automate est en état a et qu'un événement arrive sur le port in1 alors l'automate passe en état c.

L'automate passera de l'état b à l'état c si la condition (guard) est valide. Une condition est évaluée qu'à l'entrée dans l'état ou lors d'événement pris en charge par l'état (voir Actions et activités). La condition est exprimée à l'aide des variables d'états de l'automate et prend en paramètre la date d'évaluation de la condition. La fonction c1 doit alors la forme suivante :

Les méthodes after et when permettent de déclencher des transitions sur des durées ou des dates. Dans le cas d'after, la durée qui est considérée est la durée écoulée depuis l'arrivée dans l'état.

Il existe 2 façons d'exprimer la durée (ou la date) :
 * via un réel,
 * via une fonction retournant un réel.

Dans l'exemple, la transition de l'état a à l'état b sera franchie si la durée de séjour dans l'état a est égal à 5. Dans le cas de la transition de a à c, à l'arrivée dans l'état a, la fonction duration1 est appelée et retourne la durée de séjour.

L'expression de when suit les mêmes règles.

Lors d'une transition, des actions ou des sorties peuvent être réalisées.

Lors de la transition de a vers c sur l'événement in1, l'action action1 est réalisée. Cette action peut modifier les variables d'état du modèle et prend en paramètre la date de la transition et les données transportées dans l'événement.

Si l'action est associée à une condition (et non un événement) alors la méthode action1 ne prend pas en paramètre d'événement.

La définition des sorties est possible sous deux formes :
 * la sortie ne produit qu'un événement sans donnée ;
 * la sortie produit un événement avec des données qui sont liées à l'état du modèle (ici, l'état désigne les données supplémentaires définies dans le modèle).

Dans le premier cas, il suffit de faire le lien entre la transition et le port de sortie.

Dans l'exemple, un événement est déposé sur le port out lorsque l'on passe de l'état a à l'état b. Lors de la transition de a à c, c'est une fonction qui est invoquée. Cette fonction va construire l'ensemble des événements qui seront envoyées avec les données que l'on veut. La fonction doit être de la forme :

Les actions et activités d'état
Lors d'une transition et donc lors de l'entrée dans un nouvel état, on peut définir des actions.

Dans l'exemple, on définit une action mise en oeuvre par la méthode action1 lorsque l'on entre dans l'état a. La méthode action1 appartient à la classe M et a pour signature :

La méthode admet en paramètre la date (le paramètre time) à laquelle l'action est réalisée.

Grâce à l'opérateur >>, on peut aussi dire que cette même méthode est utilisée pour plusieurs états.

Une action peut être aussi définie en sortie d'état. La déclaration est identique hormis le nom de la méthode de déclaration outAction au lieu de inAction.

Il est aussi possible de définir des actions sur des événements. Dans ce cas, lors de l'événement, l'action est exécutée et aucune transition n'est réalisée donc on ne sort pas et on n'entre pas dans un état.

La méthode in1 a la même signature que les actions sur les transitions lors d'événement :

Les actions sont ponctuelles dans le temps. Si on veut qu'une opération soit réalisée tant que l'on est dans un état, il est possible de définir des activités. Une activité est une opération qui s'exécute selon un pas de temps discret tant que l'on est dans l'état.

La déclaration d'une activité ressemble aux actions en entrée ou en sortie à laquelle on ajoute la décalaration du pas de temps. Ce pas de temps est unique pour un statechart. La signature d'une activité est la suivante :

Une autre syntaxe
Il est possible de définir les élements contenus dans un état d'une autre manière :

Cette syntaxe est utilisée si une action ou une activité n'est associée qu'à un seul état.

Un exemple complet
L'attribut a est un exemple de variable d'état. L'exemple montre aussi la surcharge de l'observation afin que l'on puisse observer l'évolution de la variable d'état a</tt>.

Références

 * David Harel, Statecharts: A visual formalism for complex systems, Science of Computer Programming, 8(3):231–274, juin 1987.
 * OMG, Unified Modeling Language, Superstructure Version 2.2, février 2009 - pdf