在当前项目中,有很多GetData()方法,其中 在运行时从手写数据库中获取不同类型的数据, 并将它们设置在类的不同字段中。 然后项目有这样的方法。
void GetData(Datatype type, int& value);
void GetData(Datatype type, double& value);
void GetData(Datatype type, long& value);
void GetData(Datatype type, longlong& value);
....
有很多数据类型,因此,通常会调用这些方法 带有很多分支的开关。
void GetData(Datatype type, int& value)
{
switch(type)
{
Type1:
value = GetDataFromDB1(TYPE1);
Type2:
value = .. //get from different source
...
}
}
void GetData(Datatype type, double& value)
....
如您所见,GetData()根据第二个参数进行分类。 在每个单独的GetData()中,有很多分支。 这是获取数据的合理方法吗?
答案 0 :(得分:2)
回答“重构这个问题的最佳方法”需要更多的背景。例如,除了如何显示数据之外,更改数据的存储方式也许是合适的。我怀疑这个代码结构需要优化。
答案 1 :(得分:0)
抱歉,Java程序员来了:)
我在这里有两个解决方案:
如果您想要更改代码不多,
你可以把数据类型和他们的
相关操作转换为地图。
这么久switch(type)
陈述
可以是一个声明
map.get(type)
。
如果更体面的方式,请使用
的多态性即可。您可以为每个DBOperations定义接口
特定的DBOperation可以
在其实现的类中定义。所以
GetData
只需要调用
DBOperation接口。这很糟糕
想法。
答案 2 :(得分:0)
看起来你的自定义SQL界面已经不再适合了。查看现有的C ++ SQL库。不幸的是我不能推荐任何一个(上次我需要一个,我以愚蠢的代价写了一个新的),但是看到相关的问题C++ SQL database library comparison。
此外,官方C ++ PostgreSQL客户端libpqxx看起来非常好。
嗯,环顾四周,我似乎无法找到像我所写的那样对struct
提供通用支持的库。必须有一些...你应该能够插入你的表和标题(可能稍加修改)并获得自动接口代码。
答案 3 :(得分:0)
您可能希望重构它以使其更易于维护。
重构它以进行优化可能没有任何好处或消极,除非您通过分析显示它是性能问题。
答案 4 :(得分:-1)
不确定,如果我理解正确,但这可能会有所帮助
typedef int Datatype;
template <Datatype d, class T> struct Wrap{
Wrap(T (*p)(Datatype)) : mp(p){}
template<class T> void GetData(T &value){
value = (*mp)(d);
};
T (*mp)(Datatype);
};
int GetDataFromDB(Datatype){
return 0;
}
int main(){
Wrap<0, int> wi0(GetDataFromDB);
int val;
wi0.GetData(val);
}