Seguinte, tenho o seguinte código e gostaria de saber a melhor forma de realizar, se possível, a refatoração nele:
No projeto existem três pacotes:
jogo.core
jogo.animais
jogo.terrenos
O pacote jogo.animais contém as classes, por exemplo, de Rato e Leão, além da interface de IAnimal.
O pacote jogo.terrenos contém as classes, por exemplo, de Agua e Montanha, além da interface ITerreno.
No pacote jogo.core temos a classe Jogo.
O problema é o seguinte:
Na classe Jogo existe o método avaliaJogada que recebe um IAnimal e um ITerreno dentre outros parâmetros, para determinar se uma jogada é válida.
Um exemplo de jogada válida é quando o Rato deseja entrar na Agua. Nenhum outro IAnimal pode fazer isso. Então o meu código do método ficaria assim:
public boolean avaliaJogada(IAnimal animal, ITerreno terreno){
if (terreno instanceof Agua){
return animal instanceof Rato;
}
}
Sem dúvida esses instanceof não ficaram bonitos.
Antes eu tinha feito que ITerreno possuía um método ehPropicio(IAnimal animal) que determinava se um animal poderia entrar na Agua.
O motivo da retirada de não continuar usando esse método na interface ITerreno é que, a priori, a classes do pacote jogo.terreno não deveriam saber nada sobre as classes jogo.animais.
Então, alguém tem alguma idéia de como poderia ser feito para ser retirado esses intanceofs? Algum design pattern?
), não tem jeito. É um requisito do projeto que cada terreno tenha sua própria classe. Com Enum ficaria tudo mais simples, mas infelizmente não pode ser construído dessa forma.
). Gostei muito dessa solução.