Bonjour à tous,
Mon projet de réseau hivernal utilise abondamment les machines d'états à raison d'une par classe (
http://forum.locoduino.org/index.php?topic=763.0). Bien que mon programme soit opérationnel, je ne suis pas 100% satisfait de mon code.
Les machines d'états se répartissent entre la méthode
loop et les méthodes publiques appelées par les autres objets. De plus, les instructions
switch deviennent vite très longues et la lisibilité du code n'est pas optimale.
Idéalement, j'aimerais avoir une fonction pour chaque état. En C, on utiliserait un pointeur sur fonction dont la valeur définirait l'état courant. De multiples exemples sont disponibles sur le web, y-compris pour les AVR.
Deux approches me paraissent possibles:
Pointeur vers méthodeEn C++, il serait intéressant d'avoir une méthode pour chaque état et un pointeur vers la méthode correspondant à l'état courant.
- Avantage: les méthodes ont directement accès aux membres de la classe.
- Inconvénient: il ne semble pas simple de définir des pointeurs sur des méthodes.
Patron de conception ÉtatL'alternative est le patron de conception
état. Chaque état est implanté par une classe dérivée d'une classe abstraite. Ensuite, plutôt qu'un pointeur sur une méthode, c'est un pointeur sur la classe abstraite qui est mis en oeuvre. Le changement d'état consiste à changer l'instance d'objet correspondant à l'état courant.
- Avantage: meilleur découpage du programme.
- Inconvénient: les classes dérivées définies pour chaque état n'ont pas accès aux membres de la classe qui implémente la machine d'états. Il peut en effet être nécessaire de partager des données entre les différents états. Encore peu expérimenté en C++, j'aimerais savoir si on peut utiliser la notion d'amitié (friend class) pour cela.
Qu'en pensent les experts en C++ de Locoduino ?
Meilleures salutations.