我想重构一些遗留代码。
通过读取一些寄存器可以获得一些数据。此数据以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文件的cols取决于命令行选项。
接下来的帮助我可以将像xmlWriter和CsvWriter这样的类插入到这个数据模型中吗?
答案 0 :(得分:1)
我建议使用Strategy Pattern。 TimeStamp和PreTimeStamp声明在'Dumper'接口中是纯虚拟的(即虚拟空时Timestamp()= 0),Dumper_A和Dumper_B实现将被声明为虚拟。 然后,为数据加载的类将分配适当的Dumper实现来处理数据的转储。
答案 1 :(得分:0)
是表格数据吗?如果是这样,您可以考虑使用向量向量。
我将如何构建它是为了在抽象基类中实现数据集合,然后为实现写入函数的xml和csv版本提供子类。
答案 2 :(得分:0)
撇开你是否真的会为这项工作带来任何实际好处的问题,我会说XML本身对于中间格式是一个不错的选择,只要你不需要高性能。你可以用它来表示任何文档,它周围有一个很好的工具链,它有点人类可读(尽管不像YAML那样好),你已经将它用作数据的原生格式之一。我不认为引入像YAML或JSON这样的第三种格式或任何值得花时间的东西。
答案 3 :(得分:0)
我会使用XML作为中间格式并编写几个(现在为1)XSL transforms来将数据转换为我需要的其他格式。这对transform to CSV来说非常简单。
答案 4 :(得分:0)
根据您的要求,MVC模式可能对您有很大帮助。
您拥有数据(型号),您拥有控制器(事件,cmd选项)。所以你唯一需要的就是观点。您可以拥有一个抽象视图基类,然后继承您的特定视图类,例如XML和CSV(将来可能会更多),它将以特定格式呈现模型
答案 5 :(得分:0)
您需要一个结构,包括特定迭代的每个可能收集的数据和将文本字段(输出中的所需属性标签)映射到该结构中的成员指针的适配器类(可能用于解析或生成所需类型的函数)文本输入或输出也是如此)。如果不可能或不希望有一个包含每个可能收集的数据的结构,您可以使用类似原型对象的地图。