2010-08-24 31 views
2

在当前项目中,有很多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()s的根据第二PARAM分类。 在每个GetData()中,都有很多分支。 这是一个合理的方法来获取数据?

+4

有太少的上下文甚至没有受过教育的猜测,但它似乎这样的模板需求的臭味。 – sbi 2010-08-24 08:55:25

+0

'boost :: any'?或者'boost :: variant'? – jalf 2010-08-24 10:29:38

回答

2

要回答“重构此最佳方法”将需要更多的上下文。例如,可能应该更改数据的存储方式,以及如何显示数据。我怀疑这个代码结构需要优化。

0

对不起,Java程序员来:)
我有2个解决方案,在这里:

  1. 如果你想改变的代码并不多, 你可以把数据类型及其 相关操作成地图。 只要switch(type)声明 可能是一个声明 map.get(type)

  2. 如果更体面的方式,使用 多态性。您可以为DBOperations定义接口,每个 特定的DBOperation可以在其实现的类中定义为 。所以 GetData只需调用 DBOperation接口。这很粗糙 的想法。

-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); 
} 
+0

无论如何,一旦你在'Warp'模板中修改了类型,你可以改变'GetData()'以便更容易使用:'int val = w10.GetData()'。将它作为函数参数传递很可能只是为了方便模板参数推导。 – sbi 2010-08-24 09:44:23

+0

@sbi:true,但是我试图尽可能多地与原始代码同步(它通过引用 – Chubsdad 2010-08-24 09:52:28

+1

-1返回值:引入与现有函数1:1对应的一组对象并不构成重构。这只是混淆。 – Potatoswatter 2010-08-24 10:35:55

0

它看起来像你长出一个自定义的SQL接口。查看现有的C++ SQL库。不幸的是,我不能推荐任何(上次我需要一个,我以愚蠢的代价写了一个新的),但是看到相关问题C++ SQL database library comparison

此外,官方的C++ PostgreSQL客户端,libpqxx,看起来非常好。

嗯,环顾四周,我似乎无法找到像我写的那样的支持struct的通用支持库。必须有一些在那里......你应该能够插入你的表和标题(可能有一点修改),并获得自动接口代码。

0

您可能需要重构它以使其更易于维护。

重构它以进行优化可能没有好处,也可能是消极的,除非您已通过性能分析显示它是性能问题。