我正在开发一种用于在C ++中自动生成报告的工具。为此,我读了几个CSV和文本文件,并将数据存储在模型类中,模型类只包含简单的getter和setter方法。
在运行时,我必须将模型类中的一些数据转换为另一个表示,然后我必须将其输入另一个系统。目前,数据转换的逻辑是在模型类本身中完成的。我想将数据转换的逻辑与模型类分开,以便将来对转换逻辑的更改不会影响模型类。
那个逻辑的最佳位置在哪里?这种情况可能有一种设计模式吗?
提示:我不使用MVC模式。
答案 0 :(得分:0)
我说你的申请至少有两个职责:
理想情况下,您应该能够独立更改(1)和(2)。
您可以使用方法Model
创建一个类Model::Load( <list_of_files> )
,以公共表示形式公开自己的数据(即“Lingua Franca”)。
然后,您可以拥有[许多]类,每个新表示一个(Representation1
,Representation2
,等等)。每个表示类都将Model
实例作为其构造函数的参数,并在构造函数中执行转换为其自己的表示。
Model
用于导出数据的格式对于所有表示都是通用的,因此它被称为“Lingua Franca”。请参阅“Lingua Franca模式”。
class Model
{
public:
Model( const vector< string >& files )
{
// read files and fill data
}
boost::ptree Content() const { return data; }
private:
boost::ptree data;
};
class RepresentationX
{
public:
RepresentationX( const shared_ptr< Model >& model )
{
// converts model->Content() in the X format
}
private:
X data;
};
class RepresentationY { ... }; // similar to RepresentationX