C++模型视图设计



我目前正在为传感器数据的可视化和操作应用程序的设计而苦苦挣扎。我有一个数据库,其中包含几个带有测量数据的 STL 容器。

std::unordered_map<std::string, std::array<uint16_t, 3366>> data1;
std::unordered_map<std::string, QImage> data2;
std::unordered_map<std::string, std::vector<Point3D>> data3;

我也有不同的视图(主要是基于Qt的),每个视图都应该与特定于其中一个数据集的模型相关联。因此,data1 应该在一个名为 model1 的类中进行处理和操作,然后通过类视图 1 等方式显示。

但我似乎找不到合适的设计结构来融入这个想法。 模型授予对其处理数据的访问权限,但该数据包含在如上所述的不同容器结构中。这使得在基类中使用纯虚函数的继承是不可行的,例如

std::map<...,...> getModelData() = 0;

这种继承的最初想法是避免代码重复,但这似乎不是正确的解决方案。我知道Qt在他们的"模型视图"概念中利用他们的QVariant类在返回的类型方面具有最大的灵活性。但是,我想知道,在这里使用标准C++的最佳解决方案是什么?我读了很多关于努力实现松耦合、代码可重用性、依赖反转以及如何支持组合而不是继承的文章,但我确实在将这些理论建议付诸实践时遇到了问题,最终导致代码膨胀和重复代码大多数时候。你可以帮我吗?

也许你可以提供更多的代码,但到目前为止,我可以给出一些提示:

-您可以使用QMap而不是std::unordered_map吗?如果您需要与UI纠缠,则更敏捷

-也许使列表的第二个参数成为常见的基本类型,例如(代码未测试,被视为伪代码)

class BaseDataClass
{
public:
int getType();
QImage* getImageData();
std::array<uint16_t, 3366>>& getArray();
std::vector<Point3D>>& getVector();
private:
int mType;
BaseDataClass(); //hide ctor or make abstract, as you wish
}

您可以使用此功能避免代码重复。创建三个新类,每个类都继承自 BaseDataClass。然后,您可以创建一个遍历所有 BaseDataClass 的方法,检查类型(例如 1=QImage;2 = 数组;3 = 向量),并根据类型执行正确的方法(从所有类型 1 中获取 QImage ...)。然后,您也可以将指针转换为正确的类型。如果您的派生类获得越来越多的功能(如排序或验证数据),这会变得更好

最新更新