В настоящее время я делаю вводный курс Java, и мне было передано следующее упражнение.
"Программный код имеет ряд структурных проблем. Определите 3 наиболее важных и объясните, как они могут быть исправлено. "
public class GameView {
private Canvas canvas;
private GameModel model;
public GameView(Canvas canvas, GameModel model) {
this.canvas = Objects.requireNonNull(canvas);
this.model = Objects.requireNonNull(model);
}
...
// This method is not thread-safe, but this is not to be a considered a
// defect in this context.
public void draw() {
canvas.clear(); // Clears the canvas before drawing.
for(GameObject g : model.getGameObjects()) {
if(g instanceof KillerRabbit) {
drawRabbit(g);
} else if(g instanceof HolyHandGrenade) {
drawHandGrenade(g);
} else if(g instanceof NiKnight) {
drawKnight(g);
} else {
throw Exception(”Unknown game object type: ” + g);
}
}
}
... // Draw-methods for the various types of GameObjects to the view’s canvas.
}
public interface GameObject {
public Position getPosition();
}
public class GameModel {
/**
* Returns all objects in the game.
*/
public List<GameObject> getGameObjects() {
...
}
}
public class KillerRabbit implements GameObject { ... }
public class HolyHandGrenade implements GameObject { ... }
public class NiKnight implements GameObject { ... }
Теперь я понимаю, что метод draw () плох, потому что он не открыт для расширения (принцип Open-closed). Если вы хотите добавить дополнительные игровые объекты, вы также должны изменить метод рисования в GameView - не оптимально. Но каковы другие проблемы с этим кодом?