对于这种情况,哪种设计模式适用?

时间:2016-03-16 17:36:15

标签: c++ class oop design-patterns

我在C ++ 11中编写程序。我有一个名为 MyExperiment 的主类。在这个类中有另一个类 ReadFromAFile ,它从文件中读出有关设置的一些信息。然后我想使用数据初始化一些其他对象,这些对象是 MyExperiment 类的成员。这就是它应该是这样的:

class MyExperiment
{
    FirstObject *firstObject;
    SecondObject *secondObject;
public:
    MyExperiment()
    {
        ReadFromAFile readfromafile;
        readfromafile.read();
        firstObject = new FirstObject(/*some data from the readfromafile object */);
        secondObject = new SecondObject(/*some data from the readfromafile object */);
    }
}

每个对象 firstObject secondObject )类包含一些可以(并且应该)从文件中读取的信息一些其他变量和功能。我真的想要为每种对象类型设置两个类:一个用于可以从文件中读取的数据,另一个用于其他对象类型。

因此,我想使用ReadFromAFile类从文件中读取一些信息,然后以某种方式将信息传递给我的对象的构造者。我的问题是:做正确的方法是什么?

现在我有一些结构描述了我从 ReadFromAFile 类中的文件中读取的数据。每个结构指的是一个对象。我还有在 MyExperiment 类的构造函数中调用的getter函数:

class MyExperiment
{
    FirstObject *firstObject;
    SecondObject *secondObject;
public:
    MyExperiment()
    {
        ReadFromAFile readfromafile;
        readfromafile.read();
        firstObject = new FirstObject(readfromafile.getFirstStruct());
        secondObject = new SecondObject(readfromafile.getSecondStruct());
    }
}

我不认为这个解决方案优雅而聪明。我有一个描述我的 firstObject 的结构,然后我用它作为这个对象的构造函数。

我不知道如何以更好的方式做到这一点,所以我会感激任何言论。

我不想在我的 myExperiment 课程中阅读该文件,因为它已经很复杂,所以我需要一些帮助。

此问题是否有解决方法?

3 个答案:

答案 0 :(得分:3)

MyExperiment不依赖于文件。这取决于FirstObjectSecondObject;让它的构造函数反映出:

class MyExperiment {
  public:
    MyExperiment(FirstObject fo, SecondObject so)
     : fo(fo), so(so) { }
  private:
    FirstObject fo;
    SecondObject so;
};

现在,您已删除了MyExperimentFirstSecond对象的读取方式之间的所有依赖关系。

现在您可以创建一些工厂功能。例如,要从文件中进行实验,您可以执行以下操作:

MyExperiment make_experiment(std::string file) {
 ReadFromAFile stuff(file);
 return MyExperiment(stuff.fist_object(), stuff.second_object());
}

最后,ReadFromAFile对于一个班级来说是一个可怕的名字。可能你的意思是FileReader(可能是更通用的DataSource基类的子类)。通常,类名应该是名词,其方法应该是动词。当然,您可以随心所欲地命名它们。但noun - verb指南确实可以帮助您形成系统明确定义的心理模型。

答案 1 :(得分:1)

在我看来,你想要一个Factory。为了不重复自己并删除'结构',你可以让你的Reader类只构造对象,比如

firstObject = readfromafile.NewFirstObject();
secondObject = readfromafile.NewSecondObject();

然后你可以声明Reader FirstObject和SecondObject的朋友,并将他们的构造函数设为私有,但实际上并不需要。

答案 2 :(得分:0)

如果你真的不想定义单独的类并且(我假设那样)你几乎没有初始化策略,那么我宁愿制作一个构造函数来获取枚举来选择初始化策略,如:

typedef enum _Strategy 
{
    STRATEGY_A = 1,
    STRATEGY_B
}

class MyExperiment
{
    FirstObject *firstObject;
    SecondObject *secondObject;
    public:
        MyExperiment()
        {
            firstObject = new FirstObject(STRATEGY_A);
            secondObject = new SecondObject(STRATEGY_B);
    }
}

根据给定的策略进行文件读取和初始化为@H。古吉特在评论中写道。