Utilizzare Tell, Don't Ask: anziché chiedere agli oggetti cosa sono e quindi reagire, dire all'oggetto cosa fare e quindi i muri o le persone decidono come fanno ciò che devono fare.
Ad esempio:
Invece di avere qualcosa di simile:
public class Wall {
// ...
}
public class Person {
// ...
}
// later
public class moveTo(Position pos) {
Object whatIsThere = pos.whatIsThere();
if (whatIsThere instanceof Wall) {
System.err.println("You cannot move into a wall");
}
else if (whatIsThere instanceof Person) {
System.err.println("You bump into " + person.getName());
}
// many more else branches...
}
fare qualcosa di simile:
public interface DungeonFeature {
void moveInto();
}
public class Wall implements DungeonFeature {
@Override
public void moveInto() {
System.err.println("You bump into a wall");
}
// ...
}
public class Person implements DungeonFeature {
private String name;
@Override
public void moveInto() {
System.err.println("You bump into " + name);
}
// ...
}
// and later
public void moveTo(Position pos) {
DungeonFeature df = currentPosition();
df.moveTo(pos);
}
Questo ha alcuni vantaggi.
Per prima cosa, non è necessario regolare un albero gigante se non altro ogni volta che si aggiunge una nuova funzione di dungeon.
In secondo luogo, il codice nelle funzionalità di Dungeon è autonomo, la logica è tutto nell'oggetto indicato. Puoi facilmente testarlo e spostarlo.
Per me, la soluzione 'enum' non sembra molto migliore dal punto di vista della progettazione software rispetto alla soluzione' instanceof'. Probabilmente si può risolvere questo molto più elegantemente usando il polimorfismo del sottotipo (cioè creare sottoclassi e sovrascrivere alcuni metodi con comportamenti specifici di Person/Wall/Empty). L'altra opzione è quella di utilizzare l'invio dinamico, che viene ottenuto in modo limitato (doppia spedizione) attraverso il modello di visitatore. Penso che ora ci siano le risposte qui sotto che affrontano ciascuno di questi approcci. – DaoWen
Nota: c'è un errore di battitura nel titolo. Ma non puoi sistemarlo perché c'è già una domanda chiamata "Evitare l'instanceof in Java". Ti suggerisco di riformulare il titolo per essere più specifico. – Tunaki
Possibile duplicato di [Evitare instanceof in Java] (http://stackoverflow.com/questions/2790144/avoiding-instanceof-in-java) – Thomas