我有一種情況,我有一個類的層次結構: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;
};
這實現了一個目標在調試,我可以看到映射到有意義的名稱屬性的列表。但是它有一些缺點:對所有項目
- 屬性都在一個標題中定義(用於封裝不好)
- 我們還要挑選一些任意號碼,每個班級開始位置,以便有足夠的空間爲將來的擴展,如果我們添加更多的屬性給其中一個類。
我的問題是,是否有另一種方式來實現這一目標。一個想法是,我可以使用字符串常量,這些字符串常量的存儲空間較大,查找速度較慢,但具有使名稱唯一且每個項目類型可以定義其自己的屬性更容易的優點。
編輯: 這是需要的屬性將被序列化,所以必須是穩定的隨着時間的推移(即枚舉不會改變)。可能有多達1M個對象,但絕大多數對象將具有空的屬性表(因爲它們使用默認值)。查詢性能比插入更重要,做字符串哈希的性能命中可能可以忽略不計(我們無法衡量它是否尚未寫入!)。
你在序列化這些嗎?也就是說,值是否必須隨着時間的推移而保持穩定?記憶足跡有多重要?性能 - 「PropertyType」上的哪些操作需要快速執行?你的調試器是什麼 - 你能編寫腳本來解釋它的值嗎? – Yakk
序列化:是的,這些必須是穩定的。內存佔用:對於絕大多數項目來說屬性表都是空的,這不是太重要。性能:查找速度應該很快,但考慮到大多數表將是空的,字符串散列的計算可以忽略不計。調試器:VS2010和Xcode 4 - 我們廣泛使用調試器可視化器 –