解耦可视化方法和应用程序

时间:2015-05-26 07:36:33

标签: c++ design-patterns

这是我关于SO的第一个问题,所以请耐心等待。

我们开发了一个收集数据的应用程序,我们有一些方法可以让我们以各种方式可视化数据。随着方法数量的增加,我们决定将应用程序和可视化方法分开。我想知道实现这一目标的最佳方法是什么。我已经提出了以下代码,它有点试图将两者分开,但仍然......

有更好的方法吗?

std::vector<Line> lines;
// ...
lines[i] = Lines(...);

修改

我认为Alexander和Petr指出了正确的方向,谢谢。我将按照彼得的建议,尝试将数据分成另一类。

解读Spektre的评论:

  • 在Windows(MSVC)上开发,否则与平台无关。
  • 可视化主要是静态的,并根据用户输入进行更改。我猜每秒10次更新是刷新率的上限。
  • 您的数据传输时间是什么意思?
  • 记忆不是问题。

数据是一组对象的向量,其中包含其他对象向量,总共5个维度。

一个可视化类似于ROC curve,包含多条曲线,因此我们需要遍历部分/所有维度并计算一些统计数据。结果如下图所示。 visualization example

2 个答案:

答案 0 :(得分:2)

你所拥有的东西看起来已经很不错了。正如您可能已经假设的那样,您不是第一个遇到此类问题的人。用于将数据与可视化分离的标准解决方案称为Model View Controller Pattern (MVC),它不仅可以将数据的表示与数据本身分离,而且还允许从显示中简单地处理数据。 / p>

如果您只是想显示数据,那么您可能需要查看Observer Pattern。然后,你所拥有的已经非常接近这种模式。

答案 1 :(得分:1)

除了亚历山大的回答,我还会提到实际上你没有完全分离数据和可视化。 Application类仍然知道数据的内部结构和可视化方法的向量。你应该做的更好的是有一个单独的类,比如说Data,它将完成你需要的所有计算,然后让主类(例如App)只处理注册方法并将数据传递给他们。

这样的东西
class Data;

struct Methods {
    virtual void show(Data * a) = 0;
};

struct Method0 : public Methods {
    void show(Data * d) {
        d->getData();
    }
};

class Data {
    public:
    int getData() {
        // parse and precompute data (time-consuming, thus do it only once)
        // return the required data (not just an int..)
        return 42;
    }
}

class App {
public:
    vector<Methods *> methods;
    Data* data;

    void run() {
        // draw all registered methods
        for (auto m : methods)
            m->show(data);
    }

};