私はクラスの階層を持っている状況があります:Widget
そしてそれDoobry
はから継承するオブジェクトタイプですBase
(実際には2つ以上のタイプがあります)。オブジェクトの各インスタンスには、プロパティのリストがあります。すべてのオブジェクトに共通するいくつかのプロパティと、各アイテムタイプに固有のいくつかのプロパティがあります。単純な実装は次のようになります。
enum PropertyType {
COMMON_SIZE=0, // first section: properties common to all
COMMON_POSITION,
...
WIDGET_PROPERTY_START=100, // ensure enough space for expansion
WIDGET_DONGLE_SIZE,
WIDGET_TEXT,
...
DOOBRY_PROPERTY_START=200
DOOBRY_COLOUR
....
};
class Base {
public:
Base();
std::vector<std::pair<PropertyType, string>> properties;
};
これにより、デバッガーで意味のある名前にマップされたプロパティのリストを表示できるという1つの目的が達成されます。ただし、いくつかの欠点があります。
- すべてのアイテムのプロパティが1つのヘッダーで定義されています(カプセル化には適していません)
- クラスの1つにさらにプロパティを追加する場合、将来の拡張に十分なスペースを確保するために、クラスの開始位置ごとに任意の数を選択する必要があります。
私の質問は、この目的を達成する別の方法があるかどうかです。1つの考えは、格納するのに大きく、検索に時間がかかる文字列定数を使用できるということですが、名前を一意にするのが簡単で、各アイテムタイプが独自のプロパティを定義できるという利点があります。
編集:プロパティはシリアル化される必要があるため、時間の経過とともに安定している必要があります(つまり、列挙型は変更されません)。最大100万個のオブジェクトが存在する可能性がありますが、大部分は空のプロパティテーブルを持ちます(デフォルト値を使用するため)。ルックアップのパフォーマンスは挿入よりも重要であり、文字列ハッシュを実行することによるパフォーマンスへの影響はおそらく無視できます(まだ記述していないため、まだかどうかを測定することはできません)。