我正在和一位同事讨论,我认为这将是一个很好的问题放在这里。文件或流的路径?
当设计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