Tengo el siguiente problema
Un artículo puede tener muchos estados:
NORMAL = 0000000
DRY = 0000001
HOT = 0000010
BURNING = 0000100
WET = 0001000
COLD = 0010000
FROZEN = 0100000
POISONED= 1000000
Un elemento puede tener algunos estados al mismo tiempo pero no todos
- Es imposible estar seco y mojado al mismo tiempo.
- Si FRÍO un artículo MOJADO, se convierte en CONGELADO.
- Si CALIENTAS un artículo MOJADO, se convierte en NORMAL
- Un artículo puede estar ENCENDIDO y ENVENENADO
Etc.
He intentado establecer indicadores binarios en estados y usar AND para combinar diferentes estados, comprobando antes si es posible o no hacerlo, o cambiar a otro estado.
¿Existe un enfoque concreto para resolver este problema de manera eficiente sin tener un interruptor interminable que verifique cada estado con cada nuevo estado?
Es relativamente fácil verificar 2 estados diferentes, pero si existe un tercer estado, no es trivial.
c++
rpg
design-patterns
binary
vgonisanz
fuente
fuente
Respuestas:
Cuando necesito usar banderas, generalmente hago algo en este sentido.
Esto hace que usarlos para cosas como apply_cold () sea muy fácil y obviamente puede construir en condiciones de estado como seco y húmedo.
fuente
Dos observaciones:
COLD
yHOT
son transiciones en la forma en que las mencionas, no estados.La combinación de esas observaciones daría como resultado algo como esto:
fuente
Al representar sus estados como máscara de bits como usted escribe, puede traducir sus descripciones de las restricciones en código:
Puede envolverlo en un
makeStateConsistent()
que puede llamar antes de probar los bits de estado para asegurarse de que el estado tenga sentido.Sin embargo, una limitación de este enfoque es que no puede dar cuenta del orden de los cambios de estado. Por ejemplo, si desea obtener un resultado diferente para los artículos calientes que se humedecen que para los artículos húmedos que se calientan, no puede hacerlo así: todo lo
makeStateConsistent()
que ve el método es un objeto caliente y húmedo, sin información sobre cómo Tiene que ser así.En su lugar, lo que podría hacer es que el estado del elemento privada (al menos conceptualmente) y manipularlo a través de un conjunto de métodos como
coolItem()
,heatItem()
,wetItem()
,dryItem()
y así sucesivamente. De esa manera, los métodos de cambio de estado pueden encargarse de cualquier cambio adicional. Por ejemplo, elheatItem()
método podría verse así:Por supuesto, es posible que también desee tener un
makeStateConsistent()
método como copia de seguridad, en caso de que tenga un error en sus métodos de cambio de estado.Además, en algunos casos, puede simplificar su código eliminando estados innecesarios. Por ejemplo, ¿realmente necesita un
FROZEN
estado separado , o sería suficiente para tratar cualquier artículo frío y húmedo como congelado?fuente