2011-09-12 100 views
0

我遇到了一個小小的設計困境。這實際上不是一個「問題」,它只是困擾我,我無法找到一個更清潔的解決方案:)我希望你們中的一些人可能有一些好的想法或替代解決方案。簡單的財產製度

假設我有一些數據可以通過通信通道(串行/ IP,e.t.c)在任何時間不同步。單個數據塊很小,例如整數或浮點數。它們涉及發送數據的機器的某些狀態。我不想設計一個簡單的「財產」系統,在收到單個數據項時,或在收到MULTIPLE數據項時提醒我。例如,當我成功收集兩個整數和一個浮點數時,會給我一個警報。

比方說遠程系統可以在此給我:

DATA1 : float 
DATA2 : int 
DATA3 : int 
DATA4 : double 
DATA5 : short 

現在,在僞代碼,我想要做的就是這樣的事情(使用宏或其他)

PROPERTY(DATA1) 
PROPERTY(DATA2, DATA3) 
PROPERTY(DATA4) 

也就是說,每個屬性都會監視可變數量的數據塊,並在所有正在監視的塊已更改/已填滿時向我發送SINGLE警報。

目前我正在使用sigC++,我認爲它是一個輝煌的回調庫。我有一個工作實現,但編寫起來很麻煩,因爲C++並不真正支持可變參數列表,所以我迄今爲止所做的工作就是擁有一個類PROPERTY,它有一個數字的重載構造函數,支持1到X個參數,這不是真正的「動態」。如果我需要更多的變量監視,我需要確保有一個構造函數來處理參數的數量。

也許這只是我嘗試過設計:)

回答

1

我會寫一個Property類存儲數據塊的集合。每個塊可以是Boost.Variant或某種類型的聯合,也可以是指向實現數據塊接口的對象的指針。

的類可以像

Property p; 
p.addInt(xI).addFloat(xF).addShort(xS); 

或類似

Property p = { IntVal(xI), FloatVal(xF), ShortVal(xS) }; 

如果可以使用的C++ 0x初始化列表,其中IntVal等是轉換一個更原始的數據包裝器被初始化塊類型設置爲Property集合中使用的變體類型。

+0

可以通過定義幫助類來創建構建時間,幫助類將收集參數(對某些集合)並將其傳遞給屬性。像'Property p(PropList()。addInt(xI).addFloat(xF))'。 (在C++ 03中,也就是說,C++ 11中的初始化程序列表更容易)。 –

+0

不錯,這個解決方案看起來很乾淨!易於編寫,易於擴展。謝謝! – Daniel

0

在這裏你正在談論某種串行通信,所以你必須有一些機制來告訴你的程序什麼樣的數據要關閉串行線。否則,你怎麼能從一個double或8個字符的數組中區分出兩個32位整數?

建議爲每個消息類型從一些基本消息類型分類創建一個類。如果你的消息在本質上非常簡單(例如,它們包含一個整數,兩個整數,一個雙精度),你可能可以脫離一個聯合或類似的東西,但是你仍然需要一些指示聯合元素的鍵適用。

收集傳入消息的處理程序可能是一個討厭的複雜的野獸。我見過一些(我沒有寫這樣一個野獸),圈複雜度爲500+。