设计:分离数据及其视图

Design: Separating Data and its view

本文关键字:视图 数据 分离 设计      更新时间:2023-10-16

我想重构一些遗留代码。

有一些数据是通过读取一些寄存器获得的。这些数据以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(以后可能会有更多),它将以特定的格式

显示模型

您需要一个结构,包括为特定迭代收集的所有可能的数据,以及一个适配器类,该适配器类将文本字段(输出中所需的属性标签)映射到该结构中的成员指针(可能还具有从文本输入或输出解析或生成所需类型的功能)。如果不可能或不希望有一个包含所有可能收集的数据的结构,你可以像原型对象一样使用地图。