我目前正在使用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)其他想法?我相信有人遇到過這樣的事情。這種模式有沒有特定的名稱?