2010-01-29 82 views
0

我目前正在使用Qt的QTextStream來讀取文本文件的許多不同類型(閱讀:不同的擴展名)。每一個「的FileReader」類創建開始具有類似圖案需要它READLINE()這樣的:在這種情況下,我應該如何重構我的代碼?

// Get the line's first word as float where each word is delimited by a comma 
fileData.readLine().split(",")[0].toFloat(); 

你可以想像我有數萬在我的程序,這些線。

此外,它可能是toFloat()可能失敗(例如,讀值不轉換爲浮動),所以我打算修改上面的一行:

// Get the line's first word as float where each word is delimited by a comma 
bool convertible; 
fileData.readLine().split(",")[0].toFloat(&convertible); 
if(!convertible) throw std::runtime_error("Error!"); 

顯然,國際海事組織,最不可維護的代碼就是簡單地將上面的代碼重複給我使用readLine()的每一行。這絕對不是我計劃選擇的路徑。 (我會歡迎有人可以證明這樣做的好處)

我可以想到一些方法來重構此代碼。

1)不是直接使用Qt的QTextStream類,而是創建我自己的擁有QTextStream的類,然後創建一個名爲readFirstTokenAsFloat()的方法。在那個方法裏面,我會有如上所示的錯誤檢查。那麼現在每個「FileReader」類都會切換到使用這個新類。這種方法的優點是IMO完成了我想要做的事情,但IMO的缺點是,如果我需要做其他事情,或者如果我想使用其他QTextStream的方法,我會違反DRY原理(?)通過複製相同的方法,並在內部只有一個函數調用QTextStream。

2)或者我可以只從QTextStream繼承。這樣我就可以擴展它的功能,並且還可以獲得QTextStream的所有功能。但在這種情況下繼承是一個好主意嗎?

3)其他想法?我相信有人遇到過這樣的事情。這種模式有沒有特定的名稱?

回答

1

如果你認爲你正在使用所有的QTextStream功能,那麼繼承是IMO的方式。繼承本身並不是一件壞事,在某些情況下應該避免。但如果QTextStream中至少有一個方法不應該被調用,那麼這可能會導致一個奇怪的設計(也許在這種情況下使用接口會有所幫助)

現在,如果您使用功能的子集,然後組合(方法1)是要走的路。

我會另外建議創建一個「readFirstTokenAsFloat()」方法和你想要的其他方法的接口,然後實現接口(並在你的「FileReaders」中使用它)。通過這種方式,您可以減少耦合並更輕鬆地更改設計。

如果有什麼不清楚或有爭議,請隨時發表評論,所以我們可以改進答案=)。

相關問題