簡體   English   中英

哪種設計模式適合這種情況?

[英]Which design pattern is appriopriate for this situation?

我正在用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 */);
    }
}

每個對象firstObjectsecondObject )類都包含一些可以(並且應該)從文件中讀取的信息以及一些其他變量和函數。 我真的希望每種對象類型都有兩個類:一個用於可從文件讀取的數據,另一個用於其余的類。

因此,我想使用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類中讀取文件,因為它已經很復雜了,所以我需要進行一些加密。

有解決此問題的方法嗎?

MyExperiment不依賴於文件。 它取決於FirstObjectSecondObject ; 其構造函數反映出:

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

現在,您已經刪除了MyExperiment與讀取第FirstSecond對象的方式之間的所有依賴關系。

現在,您可以創建一些工廠功能。 例如,要從文件進行實驗,您可以執行以下操作:

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

最后, ReadFromAFile是一個可怕的類名稱。 也許您的意思是FileReader (可能是更通用的DataSource基類的子類)。 通常,類名稱應為名詞,其方法應為動詞。 當然,您可以根據需要命名。 但是noun - verb准則確實可以幫助您形成系統的明確定義的心理模型。

在我看來,您想要一家工廠 為了不重復自己並刪除“結構”,您可以讓您的Reader類僅構造對象,如下所示

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

然后,您可以聲明Reader FirstObject和SecondObject的朋友,並將其構造函數設為私有,但這並不是必需的。

如果您真的不想定義單獨的類,並且(我假設是)您沒有幾種初始化策略,那么我寧願創建一個構造函數,該構造函數使用一個枚舉來選擇初始化策略,例如:

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進行文件讀取和初始化。 古吉特在評論中寫道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM