从功能上分离数据转换与模型类

时间:2015-03-20 08:25:17

标签: design-patterns class-design

我正在开发一种用于在C ++中自动生成报告的工具。为此,我读了几个CSV和文本文件,并将数据存储在模型类中,模型类只包含简单的getter和setter方法。

在运行时,我必须将模型类中的一些数据转换为另一个表示,然后我必须将其输入另一个系统。目前,数据转换的逻辑是在模型类本身中完成的。我想将数据转换的逻辑与模型类分开,以便将来对转换逻辑的更改不会影响模型类。

那个逻辑的最佳位置在哪里?这种情况可能有一种设计模式吗?

提示:我不使用MVC模式。

1 个答案:

答案 0 :(得分:0)

我说你的申请至少有两个职责:

  1. 将一堆文件读入模型
  2. 将模型转换为另一种表示形式。
  3. 理想情况下,您应该能够独立更改(1)和(2)。

    您可以使用方法Model创建一个类Model::Load( <list_of_files> ),以公共表示形式公开自己的数据(即“Lingua Franca”)。

    然后,您可以拥有[许多]类,每个新表示一个(Representation1Representation2,等等)。每个表示类都将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