2011-09-12 36 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+。