【发布时间】:2017-06-16 22:14:14
【问题描述】:
我负责重构一些解析相似(但不同文件)的代码。它们的不同之处在于它们具有不同数量的列。假设文件类型称为MODEL_FILE和COMPANY_FILE。
MODEL_FILE 的格式如下:
CAR_MODEL CAR_COMPANY MILEAGE
COMPANY_FILE 的格式如下:
CAR_COMPANY MILEAGE
解析 MODEL_FILE 的结果将是 std::map<Car_Model, std::map<Car_Company, double> > ;解析COMPANY_FILE 的结果将是std::map<Car_Company, double>。
头文件是这样的:
typedef std::map<Car_Model, std::map<Car_Company, double> > Model_Data;
typedef std::map<Car_Company, double> Company_Data;
struct Data
{
Model_Data data_model;
Company_Data data_company;
};
bool parse_company_file(const std::string& path, Company_Data& data); // 1
bool parse_model_file(const std::string& path, Model_Data& data); // 2
bool parse_generic_file(bool is_company_file, const std::string& path, Data& data); // 3
解析代码确实在3。 1 和 2 都在内部调用 3,它知道(通过布尔参数)它要解析的文件是 2 列还是 3 列。 Data 中只有一个字段将被填充(取决于 bool 参数)。然后,调用3 的函数将从填充的Data 结构中检索结构的适当字段,并用于填充它已传递的映射。
这样,解析文件的代码只在一处(3)。从外面看,代码很好(两个不同的入口点返回适当的数据),但内部实现对我来说并不正确(使用结构作为一种方法来使用单一方法来潜在地填充的技巧两种不同且独立类型的对象)。
我曾想过使用继承,以便泛型方法接收一个指向公共基类的指针,该基类有两个方法(add_model_data() 和add_company_data())。它将根据bool 参数调用一个或另一个。然而,这更加复杂和令人困惑,并且意味着通过让基类知道低类的方法来打破抽象,它很容易出错等等。
问题是,是否有可能以某种方式将解析逻辑保留在一个地方,但使用不同于 struct 的方法(并且可以说更好)来处理不同的文件?
【问题讨论】:
-
std::map<Car_Model, Car_Company, double>没有意义。 -
当您说
std::map<Car_Model, Car_Company, double>时,您实际上是指std::map<Car_Model,std::pair<Car_Company, double>>吗?第三个参数是比较器,所以实际上它不应该以double作为第三个参数进行编译 -
我的错,这是一张地图。我已经编辑了问题。
-
您是否尝试使 parse_generic_file 函数实际上是通用的(即模板函数)?似乎可以解决问题。同样在您当前的实现中,返回值应该是联合而不是结构。这将使代码更具表现力。
标签: c++ c++11 return-type