2012-03-07 55 views
0

我想訪問文件,該文件包含各種類型的鍵 - 值對(目前僅有double,但未來可能會爲long double)。 文件訪問可能發生在鍵之間,此時會進行一些(相當複雜的)插值。訪問速度非常重要。通過模板或純虛擬基類繼承動態鍵入文件訪問?

我看到兩個possibilites來實現這一點:

  1. 使用模板寫一個通用的讀者對這種類型的文件,使用鍵和值類型作爲模板參數。這將非常快速並且很好實現,但是,它要求人們在打開時知道文件中的類型。
    要在不知道excact類型的情況下打開一個文件,我需要實現一個包裝打開各種類型的文件並轉換類型,這意味着每次訪問該文件都需要轉換幾次。
    不足之處在於這個包裝將會非常難看而且很大,因爲它必須包含一個特殊情況,用於類型的每種可能組合。我可能會自動生成這個包裝的代碼或使用一些預處理器魔術。
  2. 從計算機科學的角度來看,將鍵值和值類型封裝到類中並帶有一個通用抽象基類並處理指向這些類的指針會更好。
    這將使未知類型的文件的使用更容易,儘管它始終涉及動態轉換。
    問題是,前面提到的插值將需要構建大量的這些包裝類以及大量的虛函數調用,這可能會顯着影響訪問速度。
    我也猶豫是否加入這種無人使用的靈活性(畢竟,double是目前唯一需要的東西)。

你會做什麼?你有更好的建議嗎?

回答

2

看看工廠deasign模式。在工廠中,您將傳遞文件頭 - >類型,併爲該文件生成一個閱讀器。所以你必須定義一個接口IFile並在你的類PdfFile,TxtFile,DocxFile等中實現它。

你可以使用抽象工廠或工廠方法取決於您的需求 我會給你抽象工廠的例子:

class IFileFactory{ 
public: 
virtual IFile* getInstance(const std::string& fileHeader) = 0; //header in hex representation. 
}; 

class ConcreteFileFactory : public IFileFactory{ 
IFile* getInstance(const std::string& fileHeader){ 
    if(fileHeader == "33442233") 
    { 
     return new PdfFile(); 
    }else if(fileHeader == "4455533"){ 
     return new DocxFile(); 
    } 
    //...... 
    throw FactoryException("Unknown file"); 
} 
}; 
+0

是的,這裏的關鍵是有一個頭文件中顯示什麼類型用於爲其他實例化讀者。你可以使用工廠模式,但你不需要。 (但你應該!!):) – 2012-03-07 12:08:31

+0

嗯,是的,謝謝你,這是我想如何實現模板化設計的包裝。那麼你會選擇模板化設計,並使用工廠模式編寫包裝? – lytenyn 2012-03-07 12:39:24