Frage

Ich erstelle ein 2D -Fliesen -Basis -SIM -Spiel. Ich habe eine 2D -Reihe von GridSquares, auf die aus vielen verschiedenen Klassen und Methoden zugegriffen und geändert werden. Sollte ich jedes Mal das 2D -Array von GridSquares bestehen oder es zu einem globalen Maschinenbau machen? Welches ist Best Practice?

Ich dachte, wäre es eine Option, eine Klasse zu erstellen, die nur eine Reihe von Variablen enthält, die sich alle Klassen erweitern könnten? Ist das eine gute oder schlechte Idee / keine gute Praxis?

Ich bin immer noch ziemlich neu in Java, also lerne ich immer noch viel!

Danke im Voraus.

Rel

War es hilfreich?

Lösung

Sie sollten nicht in Bezug auf eine Datenstruktur entwerfen. Java ist eine objektorientierte Sprache. Denken Sie an Ihr Problem, wenn Objekte interagieren. Es ist kein 2D -Array; Es ist ein Board -Objekt. Bauen Sie das Verhalten für die Manipulation seines Zustands in das Problem auf und verbergen Sie die Tatsache, dass Sie zufällig ein 2D -Array ausgewählt haben.

Ich habe nicht alle Details eines Boards, aber es würde so beginnen:

public class Board
{
    // This is what you're passing around now; Board hides it.
    // Square is the abstraction of a position on the Board
    private Square[][] grid;

    public Board(int nRows, int nCols)        
    {
       this.grid = new Square[nRows][];
       for (int i = 0; i < this.grid[i].length; ++i)
       {
           this.grid[i] = new Square[nCols];
       }
    }

    // Now add methods for adding Pieces to the Board, rules for moving them, etc.
} 

Andere Tipps

Geben Sie sie in Konstruktoren weiter und halten Sie sie in Mitgliedsvariablen.

Wenn Sie von zu vielen Orten auf sie zugreifen, haben Sie wahrscheinlich ein Designproblem.

Wenn dein sicher Sie werden nur eine 2D -Reihe von Gridsquares haben, die Sie immer das Singleton -Muster verwenden könnten, wobei Essentailly es global macht.

Es gibt jedoch Argumente dafür und dagegen können Sie eines Tages feststellen, dass Sie in der Lage sein möchten, Karten vorzulegen, aber der Singleton steht im Weg (kann keine zweite Instanz eines Singletons schaffen).

Wenn Sie unbedingt in Ihrer gitterhaltigen Klasse (a) das Netz als öffentlich deklarieren und dann die A-Klasse statisch importieren (importierenimport static A;). Auf diese Weise können Sie zumindest die A -Klasse erweitern, ohne die A -Klasse zu erweitern.

Ihr Code sollte nicht von zu vielen Stellen auf das Netz zugreifen. Erwägen Sie, Ihren Code neu zu verfeinern, um zu vermeiden, dass das Netz von überall manipulieren muss. Trennen Sie Ihre Bedenken. Und es ist definitiv keine gute Idee, die Erbschaft zu verwenden, wie Sie erwähnt haben.

Was ich empfehlen würde, um es statisch zu machen, aber eine bestimmte Klasse zu erstellen, um die Daten daraus zu lesen, sagen Sie Gridsquaresacessor. In dieser Klasse schreiben Sie alle Methoden, um auf das Array zuzugreifen. Noch besser, machen Sie es zu einem privaten statischen Feld dieser Klasse, um einen anderen Code zu vermeiden, um auf eine in dieser Klasse nicht definierte Art und Weise zu manipulieren.

In jeder Klasse benötigen Sie Zugriff auf das Array, Sie können einen GridSquaresacessor als Parameter am Konstruktor übergeben und in einer lokalen Variablen gespeichert werden.

Ich persönlich mag keine Singletons, weil sie es sehr schwer machen, Code zu testen ...

Wenn Ihr Code multithread ist, stellen Sie sicher, dass das 2D-Array synchronisiert wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top