0

我想访问一个包含各种类型的键->值对的文件(例如,目前只有,但将来double可能会出现)。long double文件访问可能发生在键之间,此时将进行一些(相当复杂的)插值。访问速度非常重要。

我看到了两种实现这一点的方法:

  1. 使用模板为此类文件编写通用阅读器,使用键和值类型作为模板参数。这将非常快速且易于实现,但是,它需要人们在打开文件时知道文件中的类型。
    要在不知道确切类型的情况下打开文件,我需要实现一个包装器来打开各种类型的文件并转换类型,这意味着每次访问文件时都会进行一些转换。
    缺点是这个包装器会非常丑陋和庞大,因为它必须为每种可能的类型组合包含一个特殊情况。我可能会为这个包装器自动生成代码或使用一些预处理器魔法。
  2. 从计算机科学的角度来看,将键和值类型包装到具有公共抽象基类的类中并始终处理指向这些类的指针会更好。
    这将使未知类型文件的使用变得更加容易,尽管它始终涉及动态转换。
    问题是前面提到的插值将需要构建大量的这些包装类以及大量的虚函数调用,这可能会对访问速度产生显着的负面影响。
    我也犹豫是否要添加这种没人会使用的灵活性(毕竟,double这是现在唯一需要的东西)。

你会怎么做?你有更好的建议吗?

4

1 回答 1

2

看看工厂设计模式。在工厂中,您将传递文件的标题 -> 类型,它将为此文件生成一个阅读器。所以你必须定义一个接口 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");
 }
};
于 2012-03-07T11:05:21.677 回答