0

ボードの状態をファイルに保存し、後でファイルから読み取ってボードを再作成する必要がある小さなボードゲーム プログラムを作成しています。

この機能を以下に示すクラスに委任しています。ボードの正方形の保存形式とその座標が SQUARE_FORMAT 定数でキャプチャされ、同じ情報を読み取るための正規表現が LOAD_REGEX 定数でキャプチャされるように、これを実装したいと思います。両方がコードで相互に関連し、視覚的に解読できる必要があります (つまり、同じデータに相互に関連していることを人が明確に確認できる必要があります)。

Javaコードでこれを行うためのイディオムまたはパターンはありますか?

public class BoardPersistenceUtility {

    private final String SQUARE_SAVE_FORMAT = "";
    private fial String LOAD_REGEX = "";

    public void save(PrintWriter writer, Board board) {

    }

    public Board load(BufferedReader reader) {
        // Implement
        return null;
    }
}

更新 1:

私の質問をもう一度読むと、正確に何を探しているのか、少し混乱するかもしれません。SQUARE_SAVE_FORMAT を表す正しい方法を具体的に探しているので、正規表現 LOAD_REGEX と明確に相関します。

SQUARE_SAVE_FORMAT は、実際の値に置き換えられる特殊文字/変数を使用する文字列であることが理想的であり、結果はファイルに保存されます。LOAD_REGEX は、ファイルからコンテンツを読み取るために使用される対応する正規表現です。正規表現はキャプチャ グループを使用するため、キャプチャ グループから取得した値から元のオブジェクトを再作成できます。

私の質問は、そのような文字列のペアを作成する際のイディオムは何ですか.1つはデータの保存に使用されるフォーマット文字列であり、もう1つはそのデータの読み取り中に使用される正規表現です.

更新 2:

もう少し考えてみると、私の質問をもう少し明確にすることができたと思います。

両方の文字列を見ると、SQUARE_SAVE_FORMAT は、ボード上の正方形のテキストを作成するために String.format() で使用されるフォーマット文字列であり、ファイルに保存されます。定数 SQUARE_LOAD_REGEX は、行を読み取り、関連する部分を名前付きグループにキャプチャするために使用される正規表現であるため、元のオブジェクトを再作成できます。(私の正規表現が少し間違っていたらごめんなさい...私はすぐに何かを書きましたが、これが本当に必要なものであることを確認するためにいくつかの正規表現の原則を更新する必要があります)

これら両方の文字列を視覚的に見ると、それらを相互に関連付けるのは困難です。おそらく、Java フォーマット文字列に名前付き変数がないためです。できる最善の方法は、%i を指定することです。ここで、i は引数のインデックスです。

このような文字列のペアを表す慣用句またはパターンがあるかどうかを理解したいと思います.1つは一部のデータをテキストにフォーマットするために使用され、もう1つは同じテキストを読み取ってその部分を解析するために使用されます.

public class BoardPersistenceUtility {

    private final String SQUARE_SAVE_FORMAT = 
                  "%d,%d:%b-%s";
    private final String SQUARE_LOAD_REGEX = 
                  "^(?<row>\d*),(?<col>\d*):(?<mine>true|false)-(?<status>\w)$";

    public void save(PrintWriter writer, Board board) {

    }

    public Board load(BufferedReader reader) {
        // Implement
        return null;
    }
}
4

3 に答える 3

2

注:宣言していないので、そうではない「定数」をSQUARE_SAVE_FORMAT呼び出します。用語を明確にしておくことをお勧めします:-)LOAD_REGEXstatic final

これら 2 つをリンクする最も簡単な方法は、両方を (final) フィールドとして囲むクラスを定義することです。このような情報のペアを複数定義する場合は、クラスの複数のインスタンス (形式の種類ごとに 1 つずつ) を定義できます。

これらを定数として保持したい場合は、囲んでいるクラスを として定義するのが最善かもしれませんenum。Javaenumにもメソッドが含まれている可能性があるため、保存/ロード ロジックをenum インスタンス自体のStrategiesとして実装し、これらをポリモーフィックに呼び出すことを選択できます。これにより、コードが簡素化される場合があります。

于 2012-05-30T10:21:52.890 に答える
1

コードにコメントを入れて、それらが関連していること、それらがどのように関連しているか、それらが何のために使用されているか、一方が変更された場合はそれに応じて他方も変更する必要があることを説明します。

単体テストを実装して、保存されたボードをロードできることを確認します。

ビルドとリリースのプロセスで単体テストが実行され、そのうちの 1 つが合格しない場合は失敗することを確認してください。

于 2012-05-30T10:22:16.590 に答える
1

私はあなたが何を意味するのかまだわかりませんが、書式設定が必要なので、コメントの代わりに答えてください.

まず第一に、名前はほとんど完全に無関係です-何らかの形でそれらを関連付けます.

SQUARE_DATA_STORE
SQUARE_DATA_REGEX

第 2 に、保存されたデータの「スタイル」が 1 つしかない場合は区別しても意味がありません。BoardPersistenceUtility複数の形式がある場合、その情報は永続化ユーティリティのサブクラスなどでキャプチャされますSquareFormatPersister

3 番目に、あなたのテキストによると、データが実際に格納される場所は 1 つの文字列です。もう 1 つは正規表現です。この場合、この 2 つは「視覚的に似ている」ことはありません。複雑な正規表現は、表現できる文字列のようには (あまり) 見えません。(もちろん、この場合、ボード データがどのように見えるかがわからないため、手がかりがありません。)

あなたのコードが非常に自明ではなく、読者がコメントとコードを介して 2 つのフィールドが関連していることを理解できない場合、何かがひどく間違っています。このコードが非常に複雑で、それらの関係を簡単に伝えることができないとは想像しがたいです。


アップデート後に編集

答えはまだノーです。

正規表現で使用されるものと同様に、テンプレート メカニズムを使用してフィールドに名前を付けることができます。これにより、テンプレート コンテキストに名前付きの値 ("row" や "col" など) を入力するので、コードがもう少し自明になる場合もあります。

実際のパーサー/ジェネレーターを使用することもできますが、複雑すぎます。

DSL (Groovy、JRuby、JavaScript などを使用する内部、または解析に戻る外部) を使用して、そのようにコードのチャンクを記述することができます。

IMOあなたは考えすぎており、知覚された複雑さを過大評価しています。IMOが難易度のために過剰に設計している可能性が高いテンプレートソリューションを除いて、1つまたは2つの文を書く方がはるかに良いでしょうロードおよび保存フォーマットの「フィールド」を関連付けるには十分すぎるほどです。

于 2012-05-30T10:55:04.773 に答える