2010-08-24 32 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

您可能需要重構它以使其更易於維護。

重構它以進行優化可能沒有好處,也可能是消極的,除非您已通過性能分析顯示它是性能問題。