1

私はJavaで基本的なボードゲームを実装していますが、解決の長所と短所を判断するのに苦労しています。私はすでにコマンドパターンを使用してゲームの元に戻す機能を有効にすることに成功しており、元々はゲームモデルオブジェクトのセット全体をシリアル化することでゲームの保存/読み込みを実装することを目的としていました。

しかし、このゲームはランダムな要素がなく、常に同じ状態で初期化されるボードゲームであるため、コマンドスタックを含むオブジェクトとその時点までのコマンド自体をシリアル化するだけで、保存/読み込み機能を実装できることに気付きました。次に、ゲームを保存された位置に戻すために、すべてのコマンドを再実行します。

私のコマンドはボードのタイルやピースを形成するオブジェクトインスタンスへの参照を保持しているため、現在の設計ではこれを行うことができません。これはOOのベストプラクティスであると私は信じています。つまり、これらのモデルオブジェクトもシリアル化する必要があり、コマンドをシリアル化して実行するという目的が失われます。私の質問は、コマンドにボードタイルの整数位置を保持させるだけでは、悪い習慣と見なされるかどうかです。

コマンドクラスコードの関連部分:

private GameController controller;
private Tile sourceTile;
private Tile[] route;

public MoveCommand(GameController controller, Tile sourceTile, Tile... route) {
    this.controller = controller;
    this.sourceTile = sourceTile;
    this.route = route;
}

@Override
public void execute() {
    controller.executeMove(sourceTile, route);
}

Tile参照を、TileLocationと呼ばれる新しいシリアル化可能なクラスへの参照、またはボードがタイルを見つけられるようにXとYの整数を保持するその効果のあるものに変更するつもりです。

4

2 に答える 2

1

ゲームの状態を保存して整数として移動しても問題ありません。ただし、長期保存にJavaシリアル化を使用することはお勧めしません。(ゲームクラスを更新して保存された状態を再読み込みすることはほとんど不可能です)。長期的な永続性のために、ある種のXMLまたはJSONデータバインディング(Jackson、GSON、好きなもの)を使用します。

于 2012-03-15T21:11:12.507 に答える
0

また、シリアル化に反対し、代わりにJSONまたはXMLを選択します。ただし、シリアル化する必要がある場合は、任意のメンバー変数で「transient」キーワードを使用して、シリアル化に含まれないようにすることができます。

private transient int x = 0;

この特定の変数は、オブジェクトをシリアル化するときに含まれません。一般に、(JSONまたはXMLを使用している場合でも)これらのタイプのフィールドを一時的なものとしてマークすることをお勧めします。これにより、リフレクションを使用して、保存するフィールドを決定する特定のビジネスロジックがなくても、書き出すオブジェクトのコンテンツを検出できます。保存しないでください。

于 2012-03-17T13:26:30.230 に答える