So che questo è un problema classico ma è così difficile scegliere il modo giusto o il migliore. Lascia che ti presenti una versione semplificata del codice.
Progetta 1 usando l'interruttore:
public class Disease {
private Color color;
}
public class City {
private String name;
private int yellowCubes;
private int redCubes;
private int bluesCubes;
private int blackCubes;
public void setCubesOnCity(int cubesNb, Disease disease) {
cubesNb = computed again ..
disease.subCubes(cubesNb);
switch(disease.getColor()) {
case Colors.BLACK:
blackCubes += cubesNb;
//other cases
}
}
public int getCubesOnCity(Disease disease) {
int cubesNb = 0;
switch(disease.getColor()){
case Colors.BLACK:
cubesNb = this.getBlackCubes();
// Etc
}
return cubesNb;
}
}
Progettazione 2 con polimorfismo:
public abstract class Disease {
abstract int getCubesSetOn(City city);
abstract void setCubesOn(City city, int cubesNb);
}
// One of sub classes
public class BlueDisease extends Disease {
// Always needed for UI
public Color getColor(){return Colors.BLUE;}
@Override
int getCubesSetOn(City city) {
return city.getBlueCubes();
}
@Override
void setCubesOn(City city, int cubesNb) {
int totalCubes = cubesNb + city.getBlueCubes();
city.setBlueCubes(totalCubes);
}
}
public class City {
private String name;
private int yellowCubes;
private int redCubes;
private int bluesCubes;
private int blackCubes;
public void setCubesOnCity(int cubesNb, Disease disease) {
cubesNb = computed again ..
disease.subCubes(cubesNb);
disease.setCubesOn(this, cubesNb);
}
public int getCubesOnCity(Disease disease) {
return disease.getCubesSetOn(this);
}
}
Ora per le informazioni aggiuntive. Ci sono quattro malattie (quattro colori). È un requisito fisso per il gioco senza un reale bisogno di un design in cui è facile refactoring se abbiamo bisogno di aggiungere una nuova malattia.
Il problema è che ho sentito tante cose contraddittorie come switch è un odore di codice che tenta di usare il pattern Command (polimorfismo). Non creare classi inutili solo per accedere al polimorfismo (favor switch o comando?). Favorisci la composizione sull'ereditarietà (lo switch vince perché il colore è incluso nella malattia). Non sono abituato al pattern Command ma non mi sembra adatto ai miei bisogni.
So che nel grande schema delle cose ottengo le stesse cose con i due progetti, ma questo è un progetto in cui cerco di migliorare il design. Quindi mi piacerebbe avere opinioni e consigli su cosa dovrei preferire quando incontro questo tipo di problema ...
Grazie.