我正在和一位同事討論,我認爲這將是一個很好的問題放在這裏。文件或流的路徑?
當設計API時,你的函數應該接受文件路徑,什麼時候應該接受流?有沒有任何指導方針?
void do_something(const std::filesystem::path &file_path);
void do_something(std::istream &stream);
路徑:
- 被叫負責檢查該文件存在並且可以訪問。
- 很難進行單元測試。你必須在磁盤上創建/擁有一個文件來測試它。
流:
- 來電者是負責檢查該文件存在並且可以訪問。更多重複的樣板代碼。
- 單元測試更容易,你可以只通過一個流對象
我想一個可能的功能添加到庫中,以「幫助」打開文件時,各種各樣的東西:
std::ifstream open_input(const std::filesystem::path &file)
{
std::ifstream stream(file);
if (not stream) {
throw std::invalid_argument("failed to open file: " + file.string());
}
return stream;
}
我個人一直使用的路徑,因爲這樣我可以檢查的類型,如「.TXT」 –
恐怕這個問題將被封閉,過於寬泛或基於觀點。儘管如此,我更喜歡第二個版本,因爲它更靈活(可以與其他流一起使用),並且服從SRP。事實上,我會考慮更進一步,並創建一個基於API迭代器的。 – user58697
@ user58697處理文件時基於迭代器? – Mac