0

いくつかのモジュールで構成されるゲームがあります。

それらの1つはデータベースモジュールです。私はそれをそのようなものにしたい:

Database{
    public:
        save(&Object); //all my classes in the all modules inherit from Object
        load(&Object);
};

そのモジュールを他のモジュールから独立させるための最良の方法は何でしょうか(他のモジュールはDatabase使用中saveおよび関数でデータを保存しloadます)?

私はいくつかの解決策を検討します:

  1. すべてのオブジェクトには、クラス(アナロジーからJava)serialize()から継承されるメソッドのようなものがあります。そのメソッドを使用して文字列を取得し、保存します。明らかな欠点は次のとおりです。すべてのオブジェクトは新しいメソッドを実装する必要があり、文字列を保存するのは最適ではありません(クラスの構造を知らない)。ObjectDatabase
  2. すべてのクラスに対して「マニフェスト」を作成します(たとえば、に送信されるテキストファイルなどDatabase)。そのマニフェストは、クラスの構造が何であるかを説明します(たとえば、1つの文字列、2つのdouble、1つのまれな使用int)。欠点は柔軟性です。他のモジュールのクラスを変更すると、マニフェストに影響します。
  3. すべてのクラスには独自のメソッドとメソッドsaveがあり、それらを使用します。すべてのクラスがデータベースタイプについて知っている必要があり、コード全体に分散されるのではなく、クラス内にある必要があるため、私はそれを望んでいません(そのようなモジュールを作成することが重要です)。loadDatabasesaveloadDatabase
  4. Database他のすべてのモジュールについて知っています(そしてすべてのオブジェクトを保存する方法を知っています)。ここでの悪い点は、多くの依存関係です。モジュールのいずれかを変更すると、に影響しDatabaseます。

どちらがいいですか?それとももっと良いオプションがありますか?

4

1 に答える 1

0

私が見つけた 1 つの解決策は、すべての Object サブクラスにvirtual void serialize(ISerializer& serializer)メソッドを実装させることです。

ISerializervoid onInt(int value)には、メソッドvoid onString(const char* string)内の Object サブクラスによって呼び出される などの純粋な仮想メソッドがありserialize()ます。Database モジュールは、 ISerializerをDatabaseReaderDatabaseWriterの 2 つの別個のクラスに実装できます。後で、 ISerializerも実装するObjectInspectionFileDumperOnScreenObjectStateDebuggerまたはNetworkWriterを他のモジュールに追加できます。各オブジェクトは、拡張のすべての可能性を得るために -method を 1 回実装するだけで済みます。serialize()

長所:

  • オブジェクトの古いバージョンのデータを読み取らない限り、なんらかのバージョニング スキームが上にない限り、読み取りと書き込みが一致することがほぼ保証されます。
  • これは、オブジェクト型とシリアライザー型の数が互いに独立して増加できる直交設計です。

短所:

  • それがプロジェクトの問題である場合、主にいくつかの仮想関数のオーバーヘッド。ただし、これは、通常のゲームプレイ中に通常行うことではありません。

後で、シリアル化したくないオブジェクトを呼び出したいものに出くわす場合があります。その場合、それを純粋な仮想メソッドのみを含むISerializableインターフェイス クラスに分離することは理にかなっていますserialize()。重要なシリアライザー (デバッグシリアライザーなど) に対応するには、void onInt(const char* name, int value)代わりに etc に変更することをお勧めします。

HTH

于 2012-12-05T00:06:07.537 に答える