In un gioco basato su sprite che sto scrivendo, ogni campo in una griglia 2D contiene una serie di sprite. Principalmente conta quello superiore.Eliminazione di `instanceof`
Nel modulo regole del gioco, ho un sacco di codice come questo:
public boolean isGameWon(Board board) {
for (Point point : board.getTargetPoints())
if(!(board.getTopSpriteAt(point) instanceof Box))
return false;
return true;
}
Upadate://Do something
conta se c'è un Box
in cima ad ogni Target
. Non vedo come ciò possa essere fatto semplicemente aggiungendo doSomething()
a Sprite, a meno che doSomething()
restituisca 1 se lo sprite è una scatola e 0 altrimenti. (e questo sarebbe esattamente lo stesso di instanceof).
So che instanceof è considerato dannoso perché elimina l'idea della programmazione orientata agli oggetti.
Tuttavia, non sono sicuro di come correggere il codice nel mio caso. Ecco alcuni pensieri che ho avuto:
- Non credo lo rende meglio per semplice aggiungere un metodo
isABox()
all'interfacciaSprite
. - Sarebbe d'aiuto se
Box
fosse un'interfaccia, quindi altre classi potrebbero ottenere lo stesso privilegio? - Dovrei provare a fare qualcosa di fantasia come la corrispondenza di modelli/doppia spedizione, con modelli simili ai visitatori?
- Va bene che il modulo delle regole funziona intimamente con i tipi, semplicemente perché si suppone che conoscano comunque la loro semantica?
- L'intera idea di un modello di strategia del modulo regole è difettosa?
- Non ha senso costruire le regole negli Sprites, poiché dovrebbero essere tutti modificati dopo l'aggiunta di un nuovo tipo.
Spero che tu abbia provato qualcosa di simile e riesca a indicarmi la giusta direzione.
avete pensato di aggiungere un metodo doSomthing() per l'interfaccia Sprite e lasciare che ogni classe impleneting fornire un'implementazione per esso? – A4L
Considerare che una griglia di riferimenti di classe base non è appropriata qui, perché si desidera trattare specifiche classi derivate appositamente. (Fondamentalmente, stai violando la [LSP] (http://en.wikipedia.org/wiki/Liskov_substitution_principle)). –
@OliCharlesworth Penso che tu abbia colto nel segno, non ho trovato altri modi? –