[英]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 */);
}
}
每個對象 ( 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類中讀取文件,因為它已經很復雜了,所以我需要進行一些加密。
有解決此問題的方法嗎?
MyExperiment
不依賴於文件。 它取決於FirstObject
和SecondObject
; 其構造函數反映出:
class MyExperiment {
public:
MyExperiment(FirstObject fo, SecondObject so)
: fo(fo), so(so) { }
private:
FirstObject fo;
SecondObject so;
};
現在,您已經刪除了MyExperiment
與讀取第First
和Second
對象的方式之間的所有依賴關系。
現在,您可以創建一些工廠功能。 例如,要從文件進行實驗,您可以執行以下操作:
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.