(rapidxmlフレームワークを使用して)xmlを解析するC++アプリケーションの開発を検討していますが、これに対処する方法についてアドバイスをお願いします。
私が解析したいファイルは、スターシップ( 'outfits')のアドオンのセットを定義するXMLゲームファイルです。これは、いくつかの共通の属性(名前やコストなど)を持っていますが、さまざまなカテゴリにも分類されます。
例:固定武器:射程、射程
タレットの武器、射程、発射速度、タレットの旋回速度
アフターバーナー:加速修飾子、燃料燃焼速度
などなど
衣装には少なくとも5つの分類があり(各カテゴリに分類される3つまたは4つの衣装と言います)、武器などのいくつかの属性は互いに共通していますが、アフターバーナーのような他のカテゴリにはありません。
各タイプのオブジェクトを処理し、そのデータをオブジェクトに格納するための解析コードを書きたいのですが。また、再入力する必要があるコードの量を最小限に抑えたいと考えています(つまり、OOPスタイルを使用して、新しいカテゴリを追加したり、既存のカテゴリを調整したりできるようにします)。
これにアプローチする最良の方法は何ですか?私はすでにプログラムを開始しましたが、最良のアプローチについていくつかの情報を提供したいと思います。
これは非常に幅広い質問なので、私の考えや具体的な質問をいくつか挙げて、私が探しているものを確認できるようにします。
「outfit」と呼ばれる基本的なクラスがあり、継承を使用して特定の各カテゴリ(つまり「fixed-weapons」)の解析をカスタマイズする必要がありますか?類似のカテゴリ(つまり、「武器」)に複数レベルの継承が必要ですか?コードの再入力を最小限に抑えるには、どのようにすれば各カテゴリの特定のルーチンを作成するだけで済みますか?
どこでエラーを処理する必要がありますか:「服装」または派生クラスで?どのくらいのエラー処理が必要ですか?
後でこれらのオブジェクトに簡単にアクセスするにはどうすればよいですか?各オブジェクトを含むベクトルでリストオブジェクトを作成する必要がありますか?各オブジェクトに名前でアクセスするにはどうすればよいですか?
任意の入力を歓迎します。これを行う方法を完全かつ包括的に説明する必要はありません(ただし、それはいいでしょう:P)。
各オブジェクトタイプ-たとえば武器は、継承を使用してクラス階層を形成する必要があります。この属性は既知であり、共通の属性を正しい方法で共有する必要があります。 (時々それらはエンティティオブジェクトと呼ばれます)。
arsenalのようなクラスを1つだけ呼び出して、XMLを入力として受け取り、上記の定義に従ってオブジェクトのリストを生成する必要があります。出力は、他のオブジェクトと同じように構築されたエンティティオブジェクトです。その後、XMLを操作する必要はありません。
arsenalの出力は、簡単にアクセスできるベクター(テンプレート)にすることができます。
エラー処理:詳細については指定していませんが、原則として、クラスごとに例外を処理する必要があります。つまり、クラスごとに、生成できる例外のタイプに独自のルールセットを設定する必要があります。例えば。 rate_of_fire> MAX rate_of_fire = MAXの場合:これはコアクラス内で行う必要があり、アプリケーションはそれについて心配する必要はありません。
私は、CodeSynthesisを使用してXMLをオブジェクトに解析し(これをテンプレートにして、CodeSynthesisクラスを処理できます)、これらのオブジェクトを使用して、ビルダークラスで実際のゲーム関連オブジェクトを作成します。これらのCodeSynthesisクラスは、必要に応じて簡単にシリアル化してXMLに戻すことができます。
最初に、ゲームの本体のオブジェクトを使用および操作するコードまたは疑似コードを記述してください。これにより、オブジェクト階層がどのように見えるべきかについての洞察が得られる場合があります。それは少なくともあなたのリスト+ベクトルストレージアプローチを検証します。
深いクラス階層は時代遅れです-あなたのアプリは例外かもしれませんが、コードの繰り返しを減らすためにヘルパークラスでオブジェクトを構成することを見てください。
別のクラスのオブジェクトがXML解析を担当し、完全に形成されたメインオブジェクトを返すビルダーパターンについて考えてみます。これにより、メインクラスの複雑さが軽減され、ストレージ形式が変更された場合に役立ちます。