【问题标题】:C++ Model View DesignC++ 模型视图设计
【发布时间】:2018-01-31 09:09:01
【问题描述】:

我目前正在努力设计一个传感器数据的可视化和操作应用程序。我有一个数据库,其中包含几个 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 的类中进行处理和操作,然后通过类 view1 等显示。

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

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

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

【问题讨论】:

  • 您的代码当前是否有效?你能提供你目前的架构吗?如果所有数据都有不同的视图,那么这样做可能没有什么好处。
  • 听起来您的代码执行相同的操作但类型不同(这些类型恰好是容器)。这听起来像是模板的工作。

标签: c++ design-patterns model-view-controller


【解决方案1】:

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

-你能用 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 .. .)。然后,您也可以将指针转换为正确的类型。如果您的派生类获得越来越多的功能(例如排序或验证数据),那就更好了

【讨论】:

  • 谢谢,我想尽可能的求助于stl。我猜我的代码库太大,无法在这里发布
猜你喜欢
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 2014-01-21
  • 1970-01-01
相关资源
最近更新 更多