Automate pour controler commande en java

Résolu/Fermé
P456 - 27 août 2011 à 20:06
 P456 - 28 août 2011 à 00:36
Bonjour,


je doit faire la gestion d'une commande et le type d'une commande peut etres :
//Créer
// Livrer
//Annuler
//Bloquer
//EnCoreDeTraitement

bien sure on ne peut pas annuler si son etat n'est pas crée et ainsi de suite il me semble comme un automate et je veux le faire en java mais à l'aide d'un automate bon j ai besoin d'un exemple et si qlq à une autre idée comment peux je faire ca ??????
A voir également:

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 27/08/2011 à 21:28
Pourquoi faire ça avec un automate !?
Il te suffit de suivre l'évolution de ta commande avec un enum par exemple...
Et si tu enfreint tes propres règles, par exemple annuler alors que la commande n'est pas à l'état Creer, tu génères une exception que tu récupéreras au bon moment.

public class Commande  
{  
    protected class EtatException extends Exception  
    {  
        private static final long serialVersionUID = 1L;  
    }  
      
    protected enum Etat {Creer, Livrer, Annuler, Bloquer, Traiter};  
      
    private Etat etat = null;  
      
    public void annuler() throws EtatException  
    {  
        if (etat==Etat.Creer)  
        {  
            etat=Etat.Annuler;  
        }  
        else  
        {  
            throw new EtatException();  
        }  
    }  
}

La confiance n'exclut pas le contrôle
0
merci bcp :)
en fait j'ai pensé de le faire avec automate car dans mon application l'admin peut choisir une commande puis modifier son etat via une liste déroulant donc j é pensé à un automate si etat d'une commande est créer et l'etat choisi par l'admin est annuler alors on accepte le changement d'etat si par exemple une commande livrée alors on ne peut ps l'annuler et ainsi de suite .
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
27 août 2011 à 23:57
Un automate c'est quelque chose de très théorique, ça correspondrait à un diagramme d'état-transition en UML, mais en pratique on ne fait pas comme ça.

Dans mon exemple de code, ma méthode annuler est l'évènement qui déclenche la transition de l'état Creer à l'état Annuler. Donc finalement l'automate je l'ai respecté dans mon code.
En effet, si on choisi d'annuler on lance la méthode annuler, si l'état est Creer alors on passe à l'état Annuler, sinon on a une erreur (qu'il faudra indiquer à l'admin).

Remarque : plutôt que de créer une erreur car l'admin aura annulé alors qu'il ne le pouvait pas, tu peux créer une méthode qui te renvoie la liste des actions possibles (des états à atteindre) à partir de ton état, ainsi ton admin ne pourra pas annuler si la commande est déjà Livrer car c'est une action qu'il n'aura pas sur son écran vu que tu auras préalablement consulté les transitions acceptables grâce à ton automate.

// renvoie les états qui peuvent succéder à l'état courant
public Etat[] possibilites()
{ 
    switch (etat)
    {
    case Creer : return new Etat[] {Etat.Livrer, Etat.Annuler};
    // ...
    default : return new Etat[] {};
    }
}

Donc l'automate c'est sur le papier (ou alors un joli diagramme UML) mais quand on code en Java, sur la machine c'est avec ce genre de code qu'on travaille.
0
excellent !! j'ai bien aimé ce que tu as dit :)
je vais chercher comment je peux intégrer ca dans mon code car dans la base de donnée j 'ai mis etat comme String et aprés mapping et genération des classe alors il est mentionné comme String je sé ps si ca va inflencer ce que j'ai déja fait .

d'autre part je suis un peu bloquer car j'ai fait les fonction DAO (hibernate+spring) et je sé ps exactement ou je peux mis ca class java ; DAO ; service :( est ce que tu as une idée merci d'avance
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
28 août 2011 à 00:25
Avec les enum tu peux faire la conversion de String avec ces deux méthodes :
Etat e = Etat.valueOf(String s);
String s = e.name();

Pour le reste c'est du J2EE et je n'en sais rien ! Moi le J2SE me suffit ;-)
0
merci bcp :D
0