Olá,
tenho uma dúvida extremamente filosófica, mas considero relativamente importante e preciso decidir como vou seguir com meu proojeto Por isso, gostaria da opinião de vocês para o seguinte problema:
Estou desenvolvendo em conjunto com uns colegas um RPG, que dispensa entrar em detalhes sobre o jogo em si.
Simplificando, a questão é assim:
Tenho uma interface Character que é implementada pelo personagens do jogo (sejam eles playables, enemies, friends, etc…). Esta interface define alguns métodos comuns (attack, talk, draw, etc.).
Os personagens possuem estado (Padrão State - fine, dead, etc.) e eis que surge a questão: suponha que eu tenha um personagem que seja infectado (poisoned) de alguma maneira -> o estado do personagem passa a ser de algum subtipo de PoisonState.
Tempo depois, o mesmo personagem é infectado novamente com algum outro tipo de veneno, passando a ter “dois poisons”.
Quando um personagem está infectado, sua força de ataque, velocidade e outros atributos são alterados.
Pois bem, como vcs implementariam estas questões relativas a estados e etc.?
Considerem isto:
-> É complicado ficar implementado estados poisoned combinados (BlindedAndAngry, BlindedAndLazy…). Existem n combinações de estados possíveis e a qualquer momento podemos incluir um novo tipo de veneno no jogo, obrigando-nos a criar mais m classes (BlindedAndNewPoisonedState, LazyAndNewPoisonedState…). E lembrem-se também que o personagem pode estar infectado de várias maneiras ao mesmo tempo.
-> Sim, pode-se usar o Padrão Decorator:
O estado atual do personagem é um Wrapper e podemos ir combinando mais e mais estados no personagem.
Porém, isto acarreta uma dificuldade de implementação, pois:
Se o meu personagem está infectado com vários poisons, preciso que a força do ataque dele seja influenciada pelo poisons envolvidos. Logo, um poison pode depender de QUAL é o outro poison para determinar a força do ataque… Eu teria que adaptar o padrão para fazer isso e não consigo enxergar uma maneira decente de fazer isso hehe…
Enfim, são divagações.
Não sei se me fiz claro e, caso não tenha me feito, pf me avisem que esclareço
Gostaria de ver a opinião de vocês.
Abraço!
P.S.: não sei postei o tópico no lugar correto… fiquei na dúvida. Caso esteja no local errado, peço que os moderadores movam-no para o local correto