Améliorez vos logiciels avec le pattern Etat


précédentsommairesuivant

Introduction

Cet article parle de la manière d'utiliser au mieux le Pattern Etat, issu du livre Design Patterns: Elements of Reusable Object-Oriented Software par Erich Gamma et consors. Le Pattern Etat, lorsque bien utilisé, permet de concevoir des applications de qualité (facile à comprendre, à débugger, à maintenir, à faire évoluer) sans augmentation notable des charges de travail (temps de maintenance diminués, plus grande évolutivité).



Dans cet article, les exemples sont donnés en C++. J'ai choisi le C++ car vous pouvez très facilement adapter le code à d'autres langages comme Java. L'inverse n'est pas forcément évident (un oubli dans l'implémentation C++ peut conduire à des fuites mémoire, par exemple).

Les diagrammes ont été réalisés avec Dia, logiciel gratuit et multiplateforme pour faire des schémas de toutes sortes (UML et autres).

1. Les enjeux

Plutôt qu'un long discours, j'ai préféré vous faire une démonstration simple de ce que peut vous apporter le Pattern Etat.

Voici ce à quoi peut très vite ressembler le code d'une application (par exemple une application réseau) :

 
Sélectionnez
int MaClasse::run() {
  ...

  while (executer) {

    if ((etat == ETAT1) || (etat == ETAT2)) { 
  
      // du code
  
    } elseif (etat == ETAT3) {
  
      // du code
  
    } else {
  
      // encore du code
  
    }
  
    switch (etat) {
  
      case ETAT2:
      case ETAT3:
      case ETAT5:
  
        // encore du code
    
        if (etat == ETAT5) {
          // du code, uniquement si on est dans l'état 5
        }
  
        break;
      
      case 1:
        // du code, pour l'état 1
      
        // pas de break, histoire d'ajouter à la confusion ambiante
      
      case 4:
        // encore du code
    }
  
    ...
  }
  
}

C'est illisible, difficile à tracer, sujet à de nombreux bugs, pas du tout évolutif, etc. Pour des applications complexes, cela devient très vite ingérable.



Maintenant, regardons ce code :

 
Sélectionnez
int MaClasse::run() {

  etat = EtatInitial::getInstance() ;
  
  while( etat->executer(this) ) ;

  return etat->codeRetour() ;
}



C'est beaucoup plus propre :

  • l'implémentation est encapsulée dans différentes classes Etat
    (1 comportement = 1 classe Etat)

  • l'exécution est facile à tracer
    (mise en évidence des états du système, ainsi que des transitions entre états)

Nous verrons ceci à partir de la section suivante.


précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2006 Pierre Caboche. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.