2012-02-10 46 views
0

我開始一個新的應用程序,這將能夠在同一時間連接到很多不同的供應商數據庫。替代一個神級

在使用所有輕鬆的連接模式的思考,我做了這個代碼(C++):

class Bd 
{ 
    private: 
    TUniConnection* mpConnection; 

    public: 
    Bd::Bd() 
    { 
     mpConnection = new TUniConnection(NULL); 
    } 

    void Bd::setProvider(UnicodeString provider) 
    { 
     mpConnection->ProviderName = provider; 
    } 

    void Bd::connect() 
    { 
     mpConnection->Connect(); 
    } 

    UnicodeString Bd::getProvider() const 
    { return mpConnection->ProviderName; } 

    Bd::~Bd() 
    { delete mpConnection; } 
}; 

// In the right path to become a singleton-helper-utility-god-class 
class App 
{ 
    public: 
    // Default bd. Just a shortcut. 
    Bd* bd; 

    App() 
    { bd = getBd("BDMain"); } 

    ~App() 
    { delBd("BDMain"); } 

    Bd* getBd(UnicodeString key) 
    { 
     if(mpBdList[key] != NULL) 
     { 
      return mpBdList[key]; 
     } 
     mpBdList[key] = new Bd; 
     return mpBdList[key]; 
    } 

    void delBd(UnicodeString key) 
    { 
     delete mpBdList[key]; 
     mpBdList[key] = NULL; 
    } 

    private: 
    std::map<UnicodeString, Bd *>mpBdList; 
}; 

// Just an example of use. 
int main() 
{ 
    // Consider this instance global/singleton/etc 
    App* app = new App; 
    app->bd->setProvider("Oracle"); 
    app->connect(); 

    // Outside the main, probably in some form (this method don't exist - yet) 
    app->bd->query("blah blah blah"); 

    app->getBd("settings")->setProvider("SQLite"); 
    app->getBd("settings")->connect(); 
    app->getBd("settings")->query("blah blah blah"); 
} 

顯然還沒有工作,但你們可以有我的思想的線索。理論上,看起來很完美。 我可以輕鬆訪問主要連接(app-> bd)和短代碼。與其他連接相同。 即使對我來說完美,大家都說這是反模式和所有。

我如何能實現幾乎相同的結果,如果沒有這個「助手」類,並且仍然能夠分享我的連接/設置各種形式的課程,沒有什麼傳遞給參數/構造。

謝謝。

+0

你不需要任何您的通話新的。只需在堆棧上創建對象。例如。 '應用程序;'或'的std ::地圖<的UnicodeString,屋宇署> mpBdList;' – 2012-02-10 20:44:43

回答

1

我會做mpBdListBd靜態私有成員,同樣使getBddelBdBd靜態方法。那麼你根本不需要App,你仍然堅持一個概念,一個階級的說法。我相信還有很多其他有效的方法來設置事物。

+0

看起來很有趣,我會嘗試。但是,這不看「一般」給我,我仍然有一個遲早的神級將需要別的東西的感覺,還是我將不得不#包括了「Bd.h」周圍的所有文件。 ;/ – Stew 2012-02-10 18:43:06

+0

@Stew那麼即使它是,'Bd'將不得不包括幾乎無處不在 - 'App'書面看起來可能與Bd'的'只是一個向前聲明度日,但任何你想去的調用其中一個'Bd'的方法,'Bd'類必須成爲'#include'鏈的一部分。 – 2012-02-10 18:57:10