簡體   English   中英

如何擺脫長時間的初始化而又不失去靈活性

[英]How to get rid of long initialization without losing flexibililty

考慮這個例子

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。 這減少了所需的系統調用次數。 在這種情況下,它將在每次調用時獲取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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM