9
votes

Quelle est la meilleure pratique pour une machine d'état hiérarchique utilisant le modèle d'état?

Je suis sur le point de mettre en œuvre une machine d'état hiérarchique en C # en utilisant le motif d'état. Comme guide, j'utilise Cet exemple exemple. L'exemple ne fournit pas de réponse concernant les états hiérarchiques cependant. Malheureusement, je ne peux pas sembler trouver de bons exemples ailleurs. Ma première pensée est de créer des classés imbriqués pour les états hiérarchiques. Mais est-ce que cela est considéré comme une meilleure pratique ou y a-t-il de meilleures solutions?

salue!

mise à jour:

J'ai été assis toute l'après-midi à essayer de tenter de Mettre en œuvre le modèle d'état comme décrit ci-dessus. Le HSM est basé sur un lecteur multimédia très simple:

Texte ALT HTTP: / /www.freeimagehosting.net/uploads/e8d2d6486a.jpg

Je pensais que je l'ai fait mais une chose que je ne comprends pas. Premièrement, le code que j'ai écrit (désolé, il est tout à fait beaucoup): xxx

Lorsque vous définissez les événements dans la classe MediaPlayer, je ne peux pas appeler d'autres fonctions alors

  • onebuttonprimé
  • OFFBUTTONPRESSED

    Donc je me demande, est ma mise en œuvre tout de bien? Qu'est-ce qui ne va pas? J'ai également essayé de regarder la suggestion d'utiliser le motif composite, mais je ne comprends pas comment il devrait être utilisé avec le modèle d'état. J'espère que tout le monde peut aider!


2 commentaires

Avez-vous envisagé iEnumerable et céder? Ils fournissent des mécaniciens simples de la machine à états directs dans la langue. par exemple. yoda.arachsys.com/cshaarp/cshaarp2/iterators.html ( un des nombreux exemples sur le net)


Pour autant que je sache, votre suggestion n'est pas une bonne idée. Depuis que je suis nouveau sur le concept, j'ai cherché cela et j'ai trouvé ceci: Stackoverflow.com/questions/1194853/... Néanmoins, j'apprécie votre contribution :)


4 Réponses :


3
votes

Je pense que vous allez également vouloir composite; Cela vous permettra de relier des machines d'état ensemble.


0 commentaires

1
votes

Avant de commencer à mettre en œuvre votre propre framework FSM, jetez un coup d'œil à SMC - le compilateur de la machine à états.

SMC prend une définition textuelle d'une machine à états et génère le code pour la mettre en œuvre. Il a reculé pour une large gamme de langues, y compris C #. Il peut également produire des fichiers DOT pour générer un diagramme de la FSM.

SMC peut créer quelque chose de similaire aux machines d'état hiérarchique avec les transitions POINT et POP - essentiellement des transferts de transfert à une nouvelle machine à états, et POP renvoie le contrôle à la machine d'état d'origine.


1 commentaires

Dans quelle mesure un cadre qui peut générer une FSM peut sembler, je préfère essayer de créer mon propre FSM. Avantageux que je ne veux pas avoir beaucoup de fichiers-cadres dans mon projet. Je veux juste créer un FSM simple et propre.



2
votes

Pour faire un HSM avec le motif d'état, chaque état avec des sous-états doit être une machine à états elle-même. De cette façon, le niveau supérieur n'a aucune connaissance des sous-états (moins d'effets secondaires) et l'état peut mieux gérer ses sous-états (peut avoir un état par défaut, se souvenir de l'état dernier dans lequel il était dans l'ETC).

BTW jetant une exception lorsque vous ne pouvez rien faire d'utile avec une action est fausse. Vous devriez simplement l'ignorer. Vous ne jetez que des exceptions dans des cas exceptionnels, appuyant sur un mauvais bouton, c'est attendu Comportement des utilisateurs.


3 commentaires

+1: "... poussant un mauvais bouton est le comportement des utilisateurs attendus." C'est tout à fait normal. Il y a très peu de cas exceptionnels - je souhaite que les programmeurs comprennent cela!


Impossible d'être d'accord avec la généralisation "Vous devez simplement ignorer lorsque l'utilisateur appuyait mauvais bouton ...". Je déteste vraiment ce genre d'applications qui ne me disent rien quand je pousse le bouton évidemment bon pour une bonne raison. En tant qu'utilisateur, je devrais être informé de ce que je fais mal sans avoir à trouver une solution sur Internet ... Je ne veux pas oublier un scénario qui pourrait entraîner des données endommagées.


Je ne généralis pas, je parle de cet exemple exact. Ma préférence serait de désactiver les boutons inutilisables. Dans ce cas, l'excprétion non mise en œuvre était un abus car elle ne pourrait jamais être mise en œuvre.



1
votes

Pour que cela fonctionne de manière générique, vous devrez traiter la hiérarchie de la machine d'état comme une structure d'arbres; Les transitions entre les nœuds peuvent utiliser un algorithme d'ancêtres au moins commun (LCA) pour les arbres, puis quittez le nœud sous l'ancêtre commun de l'ancêtre commun de l'ancêtre de nœud source (en cascade de la sortie à tous les nœuds enfants), puis entrez chaque nœud sur l'ascendance de nœud cible de la Nœud inférieur à l'ancêtre commun au nœud cible, enfin, si le nœud cible a des enfants, vous devrez entrer ces comme si vous entrez dans un autre état composite.

Ceci est la méthode mentionnée dans la spécification de superstructure UML.

Vérifiez le code source dans https://github.com/steelbreeze/state.cs < / a> comme cela implémente la méthode ci-dessus.

Pour voir un exemple de travail, jetez un coup d'œil comme site de projet pour la version JavaScript sœur ici: http : //www.steelbreeze.net/state.js/


0 commentaires