这是我关于SO的第一个问题,所以请耐心等待。
我们开发了一个收集数据的应用程序,我们有一些方法可以让我们以各种方式可视化数据。随着方法数量的增加,我们决定将应用程序和可视化方法分开。我想知道实现这一目标的最佳方法是什么。我已经提出了以下代码,它有点试图将两者分开,但仍然......
有更好的方法吗?
std::vector<Line> lines;
// ...
lines[i] = Lines(...);
修改
我认为Alexander和Petr指出了正确的方向,谢谢。我将按照彼得的建议,尝试将数据分成另一类。
解读Spektre的评论:
数据是一组对象的向量,其中包含其他对象向量,总共5个维度。
一个可视化类似于ROC curve,包含多条曲线,因此我们需要遍历部分/所有维度并计算一些统计数据。结果如下图所示。
答案 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);
}
};