2012-02-10 8 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

あなたは新しく電話する必要はありません。スタックにオブジェクトを作成するだけです。例えば。 'App app;'または 'std :: map mpBdList;' –

答えて

1

私はmpBdListBdの静的なプライベートメンバを作成し、同様にBdgetBddelBd静的メソッドになるだろう。その後、あなたは全くAppを必要とせず、あなたはまだ1つのコンセプト、1つのクラスディクテーションに固執しています。私は物事を設定する他の多くの有効な方法もあると確信しています。

+0

興味深いですね、私は試してみます。しかし、これは私にとっては一般的には見えませんが、神のクラスが何か他のものに必要となるか、またはすべてのファイルの周りに#Bd.hを含めなければならないという気持ちがまだあります。 ;/ – Stew

+0

@Stewそれでも、 'Bd'はどこにでも入れなければならないでしょう - ' App'は書かれているように、 'Bd'の宣言だけで得ることができますが、 'Bd'メソッドの1つを呼び出すと、' Bd'クラスは '#include'チェーンの一部でなければなりません。 –

関連する問題