Al representar sus estados como máscara de bits como usted escribe, puede traducir sus descripciones de las restricciones en código:
if ( (state & HOT) && (state & COLD) ) {
state &= ~HOT;
state &= ~COLD; // reset both HOT and COLD flags if both are set
}
if ( (state & COLD) && (state & WET) ) {
state &= ~WET; // cold items can't be wet
state |= FROZEN; // instead, they're frozen
}
if ( (state & HOT) && (state & WET) ) {
state &= ~WET; // hot and wet items dry up...
state &= ~HOT; // ...and cool down
}
// add other constraints here...
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, el heatItem()
método podría verse así:
if ( state & COLD ) {
state &= ~COLD; // cold items become normal temp when heated
if ( state & FROZEN ) {
state &= ~FROZEN; // ...and melt if they were frozen
state |= WET;
}
} else if ( state & WET ) {
state &= ~WET; // wet items dry up when heated, stay normal temp
} else {
state |= HOT; // dry normal temp items become hot
}
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?