Альтернативы классу Бога - PullRequest
0 голосов
/ 10 февраля 2012

Я запускаю новое приложение, которое сможет одновременно подключаться ко многим базам данных разных провайдеров.

Придумав шаблон, чтобы легко использовать все соединения, я сделалэтот код (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) и короткому коду.То же самое с другими соединениями.Даже идеально для меня, все говорят, что это анти-паттерн и все такое.

Как я могу достичь почти такого же результата, без этого «вспомогательного» класса, и все же иметь возможность поделиться своими подключениями / настройками для всех форми классы, не передавая ничего параметрам / конструкторам.

спасибо.

1 Ответ

1 голос
/ 10 февраля 2012

Я бы сделал mpBdList статическим закрытым членом Bd и аналогичным образом сделал бы getBd, delBd статическими методами Bd. Тогда вам вообще не нужно App, и вы все еще придерживаетесь одной концепции, одного классового изречения. Я уверен, что есть много других правильных способов настройки вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...