J'ai le prochain problème.
Un article peut avoir plusieurs états:
NORMAL = 0000000
DRY = 0000001
HOT = 0000010
BURNING = 0000100
WET = 0001000
COLD = 0010000
FROZEN = 0100000
POISONED= 1000000
Un article peut avoir plusieurs états en même temps mais pas tous
- Il est impossible d'être sec et humide en même temps.
- Si vous COLD un élément MOUILLÉ, il devient FROZEN.
- Si vous CHAUDEZ un élément MOUILLÉ, il devient NORMAL
- Un article peut être BRÛLANT et POISON
Etc.
J'ai essayé de définir des drapeaux binaires sur des états et d'utiliser AND pour combiner différents états, en vérifiant avant s'il est possible ou non de le faire, ou en changeant de statut.
Existe-t-il une approche concrète pour résoudre ce problème efficacement sans avoir un commutateur interminable qui vérifie chaque état avec chaque nouvel état?
Il est relativement facile de vérifier 2 états différents, mais s'il existe un troisième état, ce n'est pas anodin à faire.
c++
rpg
design-patterns
binary
vgonisanz
la source
la source
Réponses:
Lorsque j'ai besoin d'utiliser des indicateurs, je fais généralement quelque chose dans ce sens.
Cela les rend très faciles à utiliser pour des trucs comme apply_cold () et vous pouvez évidemment construire dans vos conditions d'état comme sec et humide.
la source
Deux observations:
COLD
etHOT
sont des transitions dans la façon dont vous les mentionnez, pas des états.La combinaison de ces observations aboutirait à quelque chose comme ceci:
la source
Représentant vos états sous forme de masque binaire comme vous écrivez, vous pouvez simplement traduire vos descriptions des contraintes en code:
Vous pouvez envelopper cela dans un
makeStateConsistent()
que vous pouvez appeler avant de tester les bits d'état pour vous assurer que l'état a du sens.Cependant, une limitation de cette approche est qu'elle ne peut pas rendre compte de l'ordre des changements d'état. Par exemple, si vous voulez avoir un résultat différent pour les éléments chauds qui deviennent humides que pour les éléments humides qui deviennent chauds, vous ne pouvez pas le faire comme ceci: tout ce que la
makeStateConsistent()
méthode voit est un objet chaud et humide, sans aucune information sur la façon dont ça doit être comme ça.Au lieu de cela, ce que vous pouvez faire est de faire l'état de l' élément privé (au moins conceptuellement) et de le manipuler à travers un ensemble de méthodes comme
coolItem()
,heatItem()
,wetItem()
,dryItem()
et ainsi de suite. De cette façon, les méthodes de changement d'état elles-mêmes peuvent prendre en charge tout changement supplémentaire. Par exemple, laheatItem()
méthode pourrait ressembler à ceci:Bien sûr, vous souhaiterez peut-être également avoir une
makeStateConsistent()
méthode en tant que sauvegarde, juste au cas où vous auriez un bogue dans vos méthodes de changement d'état.De plus, dans certains cas, vous pouvez simplifier votre code en éliminant les états inutiles. Par exemple, avez-vous vraiment besoin d'un
FROZEN
état séparé , ou suffirait-il simplement de traiter les articles froids et humides comme congelés?la source