如何摆脱长期初始化而不会失去屈曲

How to get rid of long initialization without losing flexibililty

本文关键字:失去 何摆脱 初始化      更新时间:2023-10-16

考虑此示例

Gabi::Herbs::Filesystem::FileReader filereader
    {
    Gabi::Herbs::Filesystem::FileIn
        {Gabi::Herbs::Filesystem::Path(GABI_HERBS_STR("herbs/textio/test_utf8.txt")),0}
        ,0
    };
Gabi::Herbs::IO::ReaderBuffering reader(filereader,128);
Gabi::Herbs::TextIO::Decoder decoder(reader,Gabi::Herbs::TextIO::ConverterUTF8::factory);

是C ,但它可以是任何支持OOP的语言。所以

  1. 使用路径抽象将文件路径与常规字符串区分开
  2. 创建一个随机访问文件。这不会移动任何文件指针
  3. 使用FileReader读取文件[Filein已通过参考计数构建]。读者将从文件的开头开始零字节。
  4. 由于它是文本文件,因此最好使用缓冲i/o。这减少了所需的syscall数量。在这种情况下,它在每个呼叫时获取128个字节。
  5. 文本文件可以通过许多不同的方式进行编码。创建一个试图解码文件的解码器。

在这种情况下,如何创建包装器,以便我不需要创建三个对象和两个临时对象?可以使用合并类,但是丢失了一些灵活性。

也许可以创建一个新类:

class FileReaderDecoder
{
    Gabi::Herbs::Filesystem::FileReader filereader;
    Gabi::Herbs::IO::ReaderBuffering reader;
    Gabi::Herbs::TextIO::Decoder decoder;
public:
    FileReaderDecoder(std::string file_name)
    {/*Initialize the three member variables like you did in your own code*/}
    //Add accessor functions here to get the data from the decoded file, e.g.:
    std::string GetData(int start, int size);
}

然后呼叫还原为,例如

FileReaderDecoder file_rd_dec("herbs/textio/test_utf8.txt");
file_rd_dec.GetData(0, 16);