4

HTML コードの一部を表す XML ファイルがあります。
これらの XML ファイルには、ウィジェットの宣言も含まれています。
XML ファイルの例:

 <message id="msg">
   <p>
     <Widget name="foo" type="SomeComplexWidget" attribute="value">
        inner text here, sets another attribute or 
        inserts another widget to the tree if needed...
     </Widget>
   </p>
 </message>

すべてのウィジェットが継承するメイン Widget クラスがあります。
問題は、それをどのように作成するかです。
ここに私のオプションがあります:

  1. XML ファイルを解析し、ウィジェットを必要なオブジェクトにバインドするために必要なコードを作成するコンパイル時ツールを作成します。
    • 利点:
      • システムに追加のランタイム オーバーヘッドが発生することはありません。
      • セッターをバインドするのは簡単です。
    • 短所:
      • ビルド チェーンに別のステップを追加します。
      • システム内のすべてのウィジェットをパーサーに追加する必要があるため、保守が困難です。
      • マクロを使用してウィジェットをバインドします。
      • 複雑なコード
  2. すべてのウィジェットを自動的にファクトリに登録する方法を見つけます。
    • 利点:
      • すべてのバインディングは完全に自動で行われます。
      • すべての新しいウィジェットは、それを登録する WidgetFactory メソッドを呼び出すだけでよいため、オプション 1 よりも保守が簡単です。
    • 短所:
      • 保守性の悪夢を導入せずにセッターをバインドする方法がわかりません。
      • メモリと実行時のオーバーヘッドが追加されます。
      • 複雑なコード

何が良いと思いますか?より良い解決策を提案できますか?

4

2 に答える 2

1

ツールを作成し、それをビルドステップに含めれば、すべて問題ありません。

詳細については、以前の回答へのコメントを参照してください。

于 2010-06-02T12:16:40.093 に答える
1

あなたが投稿したバリアントについてはわかりませんが、最も簡単なアプローチ(最も効率的ではなく、「get-it-done」アプローチのようなもの)boost::serializationは、ライブラリの読み込みラッパーを作成することです。

この場合、デシリアライズ ルーチンを呼び出し、ファイル (またはマップされた部分) を指定し、ウィジェット コンテナーに登録できる構築済みオブジェクトを取得する必要があります。

おそらく、適切な保存 (シリアライズ)ルーチンを記述する必要はなく、ロードルーチンのみを記述する必要があることに注意してください。

また、いくつかの簡単な (おそらく自己実装された) パーサーを逆シリアル化ルーチンと組み合わせることができることに注意してください。たとえば、最初のパーサーはあなたに関連するコードを取得しWidget、2 番目のパーサーはそこからオブジェクトを構築します。

于 2010-06-01T17:25:25.227 に答える