En un juego basado en sprites que estoy escribiendo, cada campo en una cuadrícula 2D contiene una pila de sprites. En su mayoría, el primero cuenta.Deshacerse de `instanceof`
En el módulo de reglas del juego, que tienen una gran cantidad de código como este:
public boolean isGameWon(Board board) {
for (Point point : board.getTargetPoints())
if(!(board.getTopSpriteAt(point) instanceof Box))
return false;
return true;
}
upadate://Do something
recuento si hay un Box
en la parte superior de cada Target
. No veo cómo hacerlo con solo agregar doSomething()
a Sprite, a menos que doSomething()
devuelva 1 si el sprite es una caja y 0 en caso contrario. (y eso sería lo mismo que instanceof).
Sé que instanceof se considera perjudicial porque elimina la idea de la programación orientada a objetos.
Sin embargo, no estoy seguro de cómo corregir el código en mi caso. Aquí están algunos pensamientos que he tenido:
- No creo que hace que sea mejor a la simple añadir un método
isABox()
a la interfazSprite
. - ¿Ayudaría si
Box
fuera una interfaz, por lo que otras clases podrían obtener el mismo privilegio? - ¿Debo intentar hacer algo elegante como la coincidencia de patrones/despacho doble, con patrones de visitante como?
- ¿Está bien que el módulo de reglas funcione íntimamente con los tipos, simplemente porque se supone que conoce su semántica de todos modos?
- ¿Es defectuosa la idea de un patrón de estrategia de módulo de reglas?
- No tiene sentido crear las reglas en los Sprites, ya que todas tendrían que cambiarse cuando se agregue un nuevo tipo.
Espero que haya intentado algo similar y pueda orientarme en la dirección correcta.
Qué le pareció la adición de un método doSomthing() a la interfaz de Sprite y que cada clase impleneting proporcionar una implementación para ello? – A4L
Considere que una cuadrícula de referencias de clase base no es apropiada aquí, porque desea tratar especialmente clases derivadas específicas. (Básicamente, estás violando el [LSP] (http://en.wikipedia.org/wiki/Liskov_substitution_principle)). –
@OliCharlesworth Creo que has dado en el clavo, solo que no he encontrado otras formas? –