Exemple de mise en oeuvre de SCXML – partie 1

Introduction

Cet article fait, plus ou moins, suite à ma réfection sur les machines à états. J'ai décidé de présenter un exemple d'utilisation de SCXML. Etant donné que le programme réel dans lequel j'ai mis en oeuvre cette technologie est un logiciel commercial, je vais plutôt reprendre la documentation que j'ai écrite lors de ma phase de découverte de SCXML et l'adapter au blog.

Pour ce faire, je vais présenter une calculatrice quatre opérations.

IHM

Simple et classique :

IHM de la calculatrice SCXML

Machine à états

Voici un aperçu global de la machine à états.
SCXML : Machine à états complète
Au coeur de cette machine, il y a deux éléments similaires : operand1 et operand2. Ces éléments s'occupent de "construire" les deux opérandes pour les calculs. Entre les deux opérandes, il y a la gestion de l'opération. Avant tout cela, il y a une phase d'initialisation et après, un traitement des opérandes et de l'opérateur.

Implémentation

Cette machine a été réalisée à l'aide de la technologie SCXML. Le programme scxmlgui m'a permis de construire la totalité de la machine. Les captures d'écran sont issues de ce produit.

Déclaration des variables

Dans SCXML, il est possible de définir et de manipuler des variables dans la machine à états.

DataModel dans la machine à états

Comme on peut le voir, quatre variables sont définies :

"op1" et "op2" pour les opérandes, "oper" pour l'opérateur et "result" pour stocker le résultat. Toutes ces variables sont initialisées comme chaîne de caractères vides (&#039 pour l'apostrophe).

Exécution

Cette partie montre les principales étapes de l'exécution de la machine à états. Seuls les états ou les transitions réalisant des modifications des variables sont présentés.

Clear

Remise à zéro de la variable "result"
Etat : clear

Reset

Remise à zéro des variables op1, op2 et oper.
Etat : reset

operand1 / onDigit

La transition "onDigit" est déclenchée dès qu'un chiffre est saisi. Le code présenté ci-dessous permet d'ajouter (concaténer) ce chiffre à la variable "op1".
Transition : operand1 / onDigit

onOperation

La transition "onOperation" stocke l'opération choisie dans la variable "oper". La condition qui suit sert à reprendre le dernier résultat comme premier opérande. Ce cas particulier sera détaillé plus tard...
Transition : onOperation

operand2 / onDigit

Sans surprise, cette transition fonctionne de la même manière que pour "operand1".
Transition : operand2 / onDigit

Fonctionnement

Voici un exemple de séquence que peut traiter cette machine à états : "1 2 + 1 2 3 =". Les valeurs numériques provoquent des transitions "onDigit", les opérations (+, -, *, /) "onOperation" et le = "onEqual". Juste avant le "onEqual", voici le contenu des variables : op1=12; oper=+; op2=123; result = ''.
La suite de cette partie présente chaque étape de l'exécution en détail.

Initialisation

La machine démarre à l'état "start" puis passe à "clear" et à "reset". Une fois ces trois étapes terminées, toutes les variables sont initialisées et vides.

Premier opérande

Ensuite, la machine entre dans l'étape "operand1". Pour sortir de l'état "opérand1", il est possible de demander la transition "onClear", qui va réinitialiser les variables et se remettre à l'état "operand1", ou "onOperation" qui permet de continuer l'exécution. A l'intérieur de l'état "opérand1", il y a une "sous-machine". Celle-ci ne contient que deux états "waiting_op1" et "display_op1", la transition de l'une à l'autre s'effectue grâce à la transition "onDigit" qui s'occupe de remplir la variable "op1".

Opération

En utilisation normale, la sortie de "operand1" s'effectue grâce à la transition "onOperation" qui va donner une valeur à la variable "oper".

Deuxième opérande

Après cela, la machine se retrouve dans l'état "operand2". Cet état fonctionne exactement de la même manière que "operand1" mais en remplissant la variable "op2". Les possibilités de sorties sont "onClear" ou "onEqual".

Résultat

la transition "onEqual" va faire passer la machine par les états "compute", qui demandera à java de faire le calcul, "display_result", qui demandera l'affichage, puis retour à "reset" et donc à "operand1".

Cas particulier

Précédemment, j'ai parlé d'un cas particulier pour "onOperation". C'est à ce moment que ce cas peut se produire. La machine est à l'état "operand1" et les variables op1, op2 et oper sont vides. Si dans ce cas, la transition "onOperation" est appelée, le cas particulier fait que le contenu de result est copié dans "op1". Ainsi, il est possible de réaliser une séquence du genre "1 + 2 = + 3 =". Le "1 + 2 =" nous amène à "operand1" et le "+ " force ce cas particulier, du coup le deuxième calcul est : "3 + 3 =" ou avec les variables (result = 3 => op1=3; oper=+; op2=3).

Conclusion

Dans ce premier article sur ce sujet, j'ai présenté une machine à états permettant d'implémenter une calculatrice quatre opérations. Cette machine à été réalisée à l'aide de la technologie SCXML. Dans l'article suivant, je vais présenter la partie "Java" de cette application.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>