如何优化/重构这样的代码?

时间:2010-08-24 08:42:43

标签: c++ oop optimization refactoring

在当前项目中,有很多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()中,有很多分支。 这是获取数据的合理方法吗?

5 个答案:

答案 0 :(得分:2)

回答“重构这个问题的最佳方法”需要更多的背景。例如,除了如何显示数据之外,更改数据的存储方式也许是合适的。我怀疑这个代码结构需要优化。

答案 1 :(得分:0)

抱歉,Java程序员来了:)
我在这里有两个解决方案:

  1. 如果您想要更改代码不多, 你可以把数据类型和他们的 相关操作转换为地图。 这么久switch(type)陈述 可以是一个声明 map.get(type)

  2. 如果更体面的方式,请使用 的多态性即可。您可以为每个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);
}