文件或流的路径
Path to file or stream?
我正在与同事讨论,我认为这是一个很好的问题。
设计和API时,您的功能何时应该接受文件路径,什么时候应该接受流?有指南吗?
void do_something(const std::filesystem::path &file_path);
void do_something(std::istream &stream);
路径:
- Callee负责检查文件是否存在并且可访问。
- 很难单位测试。您必须在磁盘上创建/有一个文件进行测试。
流:
- 呼叫者负责检查文件是否存在并且可以访问。更多重复的样板代码。
- 单位测试更容易您只需传递流对象
我想一个人可以在库中添加一个函数以"帮助"打开文件,其中一些:
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;
}
您说自己可以添加"助手"功能以保留iStream接口。就可检验性而言,这也是更好的解决方案,并遵守单个责任原则(SRP)。
您的辅助功能具有一个责任(从文件创建流),而您的实际功能另一个责任(它"做某事":)。
我补充说,这取决于实际上有什么作用的上下文。例如,如果它是用于对基础功能的不同访问的外墙,那么将该接口与实际路径保持相关是有意义的。您仍然会有一个单独的辅助功能和一个从立面上使用的do_something功能。
您可能有蛋糕并吃掉它:
#include <fstream>
#include <sstream>
#include <utility>
//
// some booilerplate to allow use of a polymorphic temporary
template<class Stream, std::enable_if_t<std::is_base_of<std::istream, Stream>::value> * = nullptr>
struct stream_holder
{
stream_holder(Stream stream) : stream_(std::move(stream)) {}
operator std::istream&() && { return stream_; }
operator std::istream&() & { return stream_; }
private:
Stream stream_;
};
// helper function
template<class Stream, std::enable_if_t<std::is_base_of<std::istream, Stream>::value> * = nullptr>
auto with_this(Stream&& stream)
{
return stream_holder<std::decay_t<Stream>>(std::forward<Stream>(stream));
}
// express logic in terms of stream
void do_something(std::istream& stream_ref);
// utility functions to create various types of stream
std::ifstream file_stream();
std::stringstream string_stream();
int main()
{
// * composability with succinct syntax
// * lifetime automatically managed
// * no repetitive boilerplate
do_something(with_this(file_stream()));
do_something(with_this(string_stream()));
}
相关文章:
- 如何将更多文件夹添加到c++include路径
- 从函数角度看ID到文件路径的内部与外部映射
- 在C++中设置基于操作系统的文件路径
- C++17 文件系统::remove_all 带有通配符路径
- 从 C 中的变量获取文件的路径,C++
- 将共享库的搜索路径更改为生成文件中提供的 rpath
- 修改生成文件以简化框架 #include 路径
- 将Visual Studio Code路径设置为.clang_format文件
- Windows 非 ASCII 文件路径
- 非 ASCII 文件路径窗口
- C++和带有国家符号的文件路径(也许用 UTF8 编码)
- 获取 H5::D ataSet 的hid_t和文件中的路径以使用 H5OCopy
- 在特定 Unicode 路径中创建文件
- 如何让用户在 tinyxml2 中输入 XML 文件的路径
- 如何将COM .tlb文件导入具有相对路径C++文件中?
- C++ 路径文件存在限制为 260 个字符
- QT-在pro中指定DLL路径.文件
- 路径文件存在导致链接器错误 2028/2019
- 选择QTableWidgetItem qt的路径文件
- 如何有一个正确的路径文件读取它到stringstream