Какие проблемы со следующим GameView? - PullRequest
0 голосов
/ 30 апреля 2020

В настоящее время я делаю вводный курс 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 - не оптимально. Но каковы другие проблемы с этим кодом?

...