2012-02-10 3 views
0

나는 다른 공급자의 많은 데이터베이스에 동시에 연결할 수있는 새로운 앱을 시작하고 있습니다.하나님 클래스에 대한 대안

분명히
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"); 
} 

아직 작동하지 않습니다,하지만 너희들은 내 생각의 단서를 가질 수 있습니다 쉽게 모든 연결을 사용하는 패턴으로 생각

, 난이 코드 (C++를)했다. 이론적으로는 완벽 해 보입니다. 쉽고 짧은 코드로 기본 연결 (app-> bd)에 액세스 할 수 있습니다. 다른 연결과 동일합니다. 나에게 완벽 할지라도, 모두는 그것이 반 패턴 및 모두라고 말하고 있습니다.

어떻게이 "도우미"클래스 없이도 거의 동일한 결과를 얻을 수 있으며 매개 변수/생성자에 아무 것도 전달하지 않고도 모든 양식과 클래스에 내 연결/설정을 공유 할 수 있습니다.

감사합니다.

+0

새 전화를 걸지 않아도됩니다. 스택에 객체를 만들면됩니다. 예 : 'App app; 또는'std :: map mpBdList; ' –

답변

1

나는 mpBdListBd의 정적 개인 회원 확인 및 유사 BdgetBd, delBd 정적 메소드를 만들 것입니다. 그럼 당신은 전혀 App 필요 없어 그리고 당신은 여전히 ​​하나의 개념, 하나의 클래스 어휘를 고집하고있어. 나는 물건을 셋업하는 다른 많은 유효한 방법이 있다고 확신한다.

+0

흥미로운 것 같아, 내가 시도 할 것이다. 그러나 이것은 나에게 '일반적'으로 보지 않습니다, 나는 조만간 하나님의 수업이 다른 것에 필요할 것이거나 모든 파일에 'Bd.h'를 # 포함시켜야한다는 느낌을 갖습니다. ;/ – Stew

+0

@Stew 글자 그대로'Bd'는 거의 모든 곳에서 포함되어야합니다.'App'은'Bd'라는 단호한 선언으로 얻을 수있는 것처럼 보이지만 원하는 곳이면 어디든 갈 수 있습니다. 'Bd' 메소드 중 하나를 호출하면 클래스'Bd'가'#include' 체인의 일부가되어야합니다. –