47 votes

Comment utiliser le modèle d'état correctement?

J'ai rencontré quelques implémentations de l'état de motif dans mon expérience de la programmation, et fait un peu de. Je les ai vu utilisé dans de nombreuses situations (surtout de l'INTERFACE utilisateur et l'analyse). Le problème, c'est que le tout sous la pression d'un développement rapide transformé en difficile à gérer et compréhensible les morceaux de code. Je suis en train d'étudier la refactorisation de l'un de ces, mais je vais avoir du mal à trouver de bonnes ressources en ligne. Il existe de nombreux exemples simples de l'Etat, Motif en ligne, mais j'ai besoin d'un peu plus en profondeur les ressources.

Donc, je suis à la recherche de:

  • Exemples de pièges courants lors de l' la mise en œuvre de l'état de modèle et comment les éviter,
  • Des exemples du monde réel de état modèle fait correctement (comme dans certains projet open source/cadre)
  • Expériences personnelles avec l'état le modèle sont aussi les bienvenus

Je vous remercie pour votre temps

27voto

oosterwal Points 1092

@Ivan: Il y a un certain nombre de ressources disponibles sur le web pour Hiérarchique de l'État des Machines (HSM). Miro Samek a beaucoup écrit à propos de ce modèle de conception, et offre beaucoup d'informations utiles.

Certains articles qui devraient vous intéresser:

Le grand avantage de l'utilisation de HSM plus plat FSM état tableaux décrits par Farineuse et Moore, c'est que la hiérarchie crée une séparation de la responsabilité. Sous-états n'ont plus à manipuler ces conditions qu'ils sont expressément conçus pour gérer--non gérée événements sont passés à la mère de l'etat, si le parent de l'état n'est pas expressément conçu pour manipuler puis il est passé à la prochaine hausse des parents et ainsi de suite. Il vous permet de créer de petites, faciles à utiliser des machines d'état qui servent chacun un but unique, qui peut tenir dans un seul objet. Que de nouvelles fonctionnalités sont ajoutées, ou que de nouvelles classes sont ajoutés, ils ont seulement besoin de gérer leur propre petite partie du monde et de passer sur la non prise en charge des événements de leurs parents respectifs.

Lors de la mise en œuvre correctement, vous profitez d'un programme performant avec une faible complexité cyclomatique, qui est facile à modifier ou mettre à jour au besoin.

24voto

orangepips Points 7494

Comme vous l'avez sans doute pu le lire, la Conception de l'État, Modèle est utile lorsque l'état varie selon le comportement de certains objets dont la composition comprend cet état. Cela implique l'idée d'un State classe abstraite, interface, ou d'un type énuméré - même en fonction de la langue Duck-Typing va faire aussi bien que définit toutes les communes de comportement et/ou de méthodes requises.

Les Principaux Aspects

Il y a vraiment deux principaux aspects à prendre en compte dans le travail avec l'état de motif: l'énumération et de la transition. L'énumération signifie simplement l'identification de l'ensemble des états possibles (par exemple, les jours de la semaine), ou de manière plus abstraite les types d'états (notamment les méta unis) telles que le début, la fin, et entre les deux pour un moteur de workflow.Transition signifie décider comment le modèle de circulation entre les etats où cela est généralement fait en capturant toutes les transitions possibles dans une représentation sous forme de tableau (c'est à dire Finite State Machine) ou de faire de chaque etat connaître son éventuelle "transitions" à d'autres états.

Généralement, les transitions vont main dans la main avec les méta-états-unis parce que ce n'est pas possible de connaître tous les états et les relations à l'avance dans un tel système dynamique où les nouveaux etats, et donc les transitions, peuvent être ajoutés lors de l'exécution. En outre, avec l'approche de transition, certains comportements - les notifications par exemple - devient partie intégrante de la transition, au lieu de l'état lui-même.

Exemples

Il y a plusieurs scénarios, j'ai travaillé sur ou discuté où c'est une installation d'usage:

  1. Flux de travail
  2. Ordinateur De Jeu De L'Adversaire A. I.
  3. L'Orchestration Des Processus

Par flux de travail , je veux dire quelque chose comme jBPM. De tels systèmes sont concernés par le commandant de la droite attention, des bonnes personnes, au bon moment. Ils ont l'habitude de l'envoyer beaucoup de courriels ou de quelque autre sorte de notification. Et, les processus qu'ils représentent les besoins de la capacité à changer à mesure que l'organisation change, alors que les données gérée généralement des modifications beaucoup plus lentement.

Ordinateur de Jeu de l'Adversaire A. I. est auto-explicatif. Pas quelque chose que j'ai écrit, mais dans la conversation avec ceux qui ont, ces systèmes sont généralement autonomes. En d'autres termes, à la différence de flux de travail, le jeu n'a généralement pas la possibilité de modifier le processus utilisé pour contrôler les adversaires d'ordinateur.

L'Orchestration des processus est similaire à flux de travail, tout en mettant l'accent sur l'intégration du système, au lieu de personnes de l'interaction. L' Apache Mule cadre en est un exemple. Ici, l'état peut décrire l'état (par ex. commencé, en cours, terminé) et le type (par exemple, ftp point d'intégration, intégration de sql point).

Conclusion

Contrairement à d'autres réponses, je pense que l'état d'encapsulation est un excellent moyen de gérer le changement dans les systèmes logiciels. Bien fait, il facilite ces changements ou permet aux utilisateurs de le faire au moment de l'exécution. Vous faites un compromis de plus de flexibilité en échange de l'augmentation de la complexité de mise en œuvre. Si une telle approche n'est probablement pas utile pour le panier par exemple, si le comportement est probablement très bien connue et n'est pas à modifier. En revanche, lorsque le processus est sujet à changement, il fait un très bon ajustement.

8voto

neuro Points 6590

Rien que mes 2 centimes, le modèle d'état s'avère toujours difficile à maintenir car il est difficile à comprendre par ceux qui ne l'ont pas codé. Je reviens généralement à l'ancien tableau standard de pointeurs de fonctions / méthodes, comme dans mon ancienne expérience en C. Vous venez de construire un tableau à deux dimensions de pointeurs de fonction avec état / signal pour lignes / colonnes. Plus facile à comprendre. vous avez une classe qui gère cela et vous déléguez à une autre classe pour gérer la complexité ...

my2c

6voto

Glenner003 Points 971

La plupart du temps, les états dans un état de modèle de conception sont la manipulation de plus qu'un état (ou de sous-états de l'etat) qui les rend plus difficiles à maintenir.

Si un état a toute sorte de sélection de là, surtout de la manipulation de plus d'un état.

Je prend beaucoup de discipline que les états propres.

Une solution possible à ce problème consiste à rendre plus complexes les états statemachines eux-mêmes (HSM). Cela le rend beaucoup plus lisible au niveau supérieur, parce qu'il a à traiter avec moins d'états.

4voto

Andy T Points 8016

jetez un oeil à la machine à états finis . Presque toutes les langues matures ont leurs propres exemples. Comme vous n'avez pas spécifié votre langue préférée, je vais vous donner l'exemple C ++: bibliothèque Boost FSM . C'est probablement beaucoup plus compliqué que nécessaire, mais cela peut vous donner des conseils de conception à coup sûr

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X