Estoy diseñando un juego, que hace transiciones a través de un puñado de estados, he visto que se usan dos patrones, uno es el siguiente:
1) patrón de enumeración donde como tal:
static {
// standard states
transitions.put(PHASE 1, new State[]{PHASE2, PHASE3, PHASE4});
2) El patrón de estado en una clase, donde tiene un resumen, y subclases que extienden el resumen y representan cada estado. ¿El patrón de monostato?
Estoy algo desgarrado entre los dos, ambos parecen buenas soluciones, ¿qué sería más limpio para un juego y más fácil de entender?
Personalmente me gusta el monostato, pero el método de enumeración parece ser el camino.
Respuestas
2 para la respuesta № 1En cuanto al "código más limpio", es una cuestión de elección.
Algunas cosas a considerar
¿Qué pasará con el código si lo añades?¿Otro estado y N transiciones? ¿Todavía es legible para usted y los otros desarrolladores del equipo? Pruebe y llegue a algún tipo de consenso o quizás incluya esto en una guía de estilo de código.
En mi humilde opinión, dado que el lenguaje que está utilizando está orientado a objetos, usaría el patrón de estado del libro de GOF, ya que utiliza encapsulación y polimorfismo.
Si lo estuviera escribiendo en "C", optaría por el enfoque basado en la tabla.
1 para la respuesta № 2
Eso depende de si necesita almacenar alguna lógica empresarial en el estado o no. La segunda opción probablemente hace esto más fácil. Todos tus estados pueden implementar algo como:
interface State {
State transition(Event event);
}
y luego puedes tener un tipo de clase de administrador que te permite administrar la transición:
class StateManager {
State actualState = new BaseState();
void processEvent(Event event) {
actualState = actualState.transition(event);
}
}
Tus implementaciones de State
luego elija y devuelva el siguiente estado en función de la entrada.
Básicamente estás implementando una máquina de estado finito.
Si su máquina es susceptible de complicarse.rápidamente, deberías, como dice @duffymo, externalizar las transiciones. Estoy seguro de que hay bibliotecas que hacen esto, aunque no conozco ninguna por su nombre.
0 para la respuesta № 3
No recomendaría ninguno. Escriba una máquina de estados finitos y externalice los estados y las transiciones a XML o JSON. Será un diseño mucho más flexible.