3

2D タイル ベースの sim ゲームを作成しています。多くの異なるクラスやメソッドからアクセスおよび変更される gridSquares の 2 次元配列があります。毎回 gridSquares の 2 次元配列を渡す必要がありますか、それともグローバルにする必要がありますか? ベストプラクティスはどれですか?

私は、すべてのクラスが拡張できる一連の変数を含むクラスを作成するオプションがあるでしょうか? それは良いアイデアですか、それとも悪いアイデアですか / 良い習慣ではありませんか?

私はまだJavaにかなり慣れていないので、まだ多くを学んでいます!

前もって感謝します。

リリース

4

5 に答える 5

7

データ構造の観点から設計するべきではありません。Java はオブジェクト指向言語です。問題をオブジェクトの相互作用として考えてみてください。これは 2D 配列ではありません。ボード オブジェクトです。その状態を操作する動作を問題に組み込み、たまたま 2D 配列を選択したという事実を隠します。

ボードのすべての詳細を解決したわけではありませんが、次のように開始します。

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.
} 
于 2009-04-25T12:20:28.387 に答える
4

それらをコンストラクターで渡し、メンバー変数に保持します。

アクセスする場所が多すぎる場合は、おそらく設計上の問題があります。

于 2009-04-25T11:13:30.340 に答える
2

「gridSquares の 2 次元配列」が 1 つしかないことが確実な場合は、常にシングルトン パターンを使用して、本質的にグローバルにすることができます。

ただし、これには賛否両論があります。マップをプリロードできるようにしたい場合がありますが、シングルトンが邪魔になります (シングルトンの 2 番目のインスタンスを作成できません)。

于 2009-04-25T11:13:05.117 に答える
1

絶対に必要な場合は、グリッドを含むクラス (A) でグリッドをパブリックとして宣言し、A クラスを静的にインポートします ( import static A;)。これにより、少なくとも A クラスを拡張せずにグリッドを操作できるようになります。

コードがあまりにも多くの場所からグリッドにアクセスするべきではありません。あらゆる場所からグリッドを操作する必要がないように、コードをリファクタリングすることを検討してください。懸念事項を分離します。あなたが言及したように、継承を使用することは間違いなく良い考えではありません。

于 2009-04-25T11:08:09.120 に答える
1

静的にすることをお勧めしますが、GridSquaresAcessor など、データを読み取るための明確なクラスを 1 つ作成します。このクラスでは、配列にアクセスするためのすべてのメソッドを記述します。さらに良いことに、このクラスで定義されていない方法で他のコードを操作することを避けるために、このクラスのプライベート静的フィールドにします。

配列へのアクセスが必要なすべてのクラスで、1 つの GridSquaresAcessor をコンストラクターのパラメーターとして渡し、それをローカル変数に格納しておくことができます。

シングルトンはコードのテストを非常に難しくするため、個人的には好きではありません...

コードがマルチスレッドの場合は、必ず 2D 配列を同期させてください。

于 2009-04-25T12:35:56.353 に答える