设计:分离数据及其视图
Design: Separating Data and its view
我想重构一些遗留代码。
有一些数据是通过读取一些寄存器获得的。这些数据以csv和xml文件表示。
目前的方式是肮脏的。数据和视图(XML、CSV)之间没有分离。因此,实际上,对于每种格式,每次都要收集数据。
给你一张照片,它目前是这样的:
A::Timestamp()
{
//does some data collection and dumps to csv file
//the header for this csv file is built in PreTimeStamp function.
//depending on some command line options certain cols are added.
filehndle << data1 << ","<<data2<<"," << data3;
if( cmd_line_opt1 )
{
filehndle << "," << statdata1 <<","<<statdata2;
}
}
A::PreTimeStamp()
{
//header for csv file
filehndle << "start, end, delta";
if( cmd_line_opt1 )
{
filehndle << "," << "statdata1 , statdata2";
}
}
还有另一个类B::Profile(),它以与A::Timestamp相同的方式进行数据收集,但数据被转储为XML。
我想对它进行重构,以便将数据集合放在一个公共位置。并使用csv和xml的一些适配器来获取数据并以该格式进行转储。
现在,我需要一些关于我可以使用什么模型来表示数据的帮助。收集的数据不是固定的,所以我不能将其建模为struct
或一些静态类型。添加到csv文件的列取决于命令行选项。
下一个帮助是,我可以将xmlWriter和CsvWriter之类的类插入到这个数据模型中吗?
我建议对此使用策略模式。在"Dumper"接口中,TimeStamp和PreTimeStamp声明将是纯虚拟的(即虚拟的void TimeStamp()=0),而Dumper_A和Dumper_B实现将被声明为虚拟的。然后,加载数据的类将被分配适当的Dumper实现来处理数据的转储。
是表格数据吗?如果是这样,您可以考虑使用向量中的一个向量。
我的结构是在一个抽象基类中实现数据收集,然后为实现写函数的xml和csv版本创建子类。
抛开是否真的会从这项工作中获得任何实际好处的问题不谈,我认为XML本身是一个很好的中间格式选择,只要您不需要高性能。你可以用它来表示任何文档,它周围有一个很好的工具链,它在一定程度上是可读的(尽管不如YAML等其他文档),而且你已经将它用作数据的原生格式之一。我认为引入第三种格式,如YAML或JSON或其他什么都不值得花时间。
我会使用XML作为中间格式,并编写几个(目前为1)XSL转换来将数据转换为我需要的其他格式。转换为CSV非常简单。
查看您的需求,MVC模式可能会对您有很大帮助。
你有数据(模型),你有控制器(事件,cmd选项)。所以你唯一需要的就是视野。您可以有一个抽象的视图基类,然后继承您的特定视图类,如XML和CSV(以后可能会有更多),它将以特定的格式
您需要一个结构,包括为特定迭代收集的所有可能的数据,以及一个适配器类,该适配器类将文本字段(输出中所需的属性标签)映射到该结构中的成员指针(可能还具有从文本输入或输出解析或生成所需类型的功能)。如果不可能或不希望有一个包含所有可能收集的数据的结构,你可以像原型对象一样使用地图。
- 在网格视图中显示数据 - 基于 MFC c++ 对话框的应用程序
- Qt C++ - 在一个视图中显示来自多个SQLite表的数据
- Pybind11:创建数据的numpy视图
- 在QT视图中显示位图数据
- 列表视图最初不显示数据
- 范围视图作为数据成员
- Qt中数据类(模型)和视图/控制器类之间的数据通信的正确方式是什么
- Qt:模型/视图框架上的数据转换
- MFC 中是否有任何类似数据网格视图的控件
- 具有两种不同视图的Qt数据模型
- Qt 5.2模型视图模式:如何通知模型对象底层数据结构的变化
- 如何将自动递增的主键的数据从 sql 服务器获取到我的数据网格视图
- MFC树视图控件:寻找一种万无一失的方法来处理数据
- 在具有多个视图的 QML 中查看、编辑和更新数据(来自C++),而数据保留在C++(订阅数据)中
- Qt模型视图:当数据存储和更改数据时,更新模型和视图的正确方法是什么::vector
- 用来自 std::map 的数据填充 QML 列表视图
- 如何与树视图共享数据,例如由gtk_list_store完成的数据
- Qt C++ 从表视图的选定行中获取数据
- 在显示视图之前,是否可以在内部更改模型数据
- 如何将用户输入的数据从数据网格视图获取到窗口窗体图