0

これまで MySQL をサポートしていたデータベース ブラウジング アプリケーションを設計していますが、最近、Sqlite のサポートも実装し始めました。これは「接続」部分 (つまり、ユーザー/データベース/ホストを取得する場所、または sqlite の場合はファイル名) に関するものであり、データベース機能に関するものではありません。それはすでに整理されています。

のような「通常の」メソッドを公開する基本クラス「接続」 、またはデータベースを識別するために使用できる文字列を返すname()ような純粋な仮想メソッドがあります( MySql、Sqliteなど)。virtual string fullLocation() = 0database@host/etc/mydb.sqlite

もちろん、ユーザーは接続先のデータベースを指定する必要があるため、アプリケーションの GUI でタイプを選択し、資格情報を入力するだけです。そして、ここで私のトラブルが始まります。私は aMySqlConnectionとaSqliteConnectionクラスを作成しました。どちらも派生していますConnectionが、ほとんどの場合、次のような結果になります。

        Connection* c = 0;
        if(gui->engine_name() == "MYSQL")
        {
            string host = gui->getHost();
            string user = gui->getUser();
            string password = gui->getPassword();
            int port = gui->getPort();
            string db = gui->getDatabase();
            c = new MySqlConnection(host, user, password, db, port);
        }
        else
        {
            string dbFile = gui->getSqliteDbFile();
            c = new SqliteConnection(dbFile);
        }
        string meta = application->use_connection(&c);

そして、これら 2 つのデータベース エンジンの性質が大きく異なるため、これがアプリケーション全体で続くのではないかと心配しています。

これをエレガントな方法で解決する方法についてのガイダンスはありますか?

4

2 に答える 2

0

抽象的な方法で接続を作成するパターンファクトリーが必要です。表面的な答えです。この Factory は、Builder パターンでパラメーター化すると便利です。そんな感じ:

 ParamBuilder *b = new ParamBuilder;
 if(gui->engine_name() == "MYSQL")
 {
      b->setHost(gui->getHost())
       ->setUser(gui->getUser());
       ->setPassword(gui->getPassword());
        ...
  }
  else
  {
      b->setFile(gui->getSqliteDbFile());
  }
  Connection *c = globalConnectionFactory->createConnection(b);
于 2013-04-15T12:22:57.863 に答える
0

はるかに洗練された方法は、ファクトリ クラスを設計し、GenerateConnection()そのファクトリのメソッドで GUI 入力を処理することです。

void ConnectionFactory::GenerateConnection(Connection* c)
{
 if(gui->engine_name() == "MYSQL")
    {
        string host = gui->getHost();
        string user = gui->getUser();
        string password = gui->getPassword();
        int port = gui->getPort();
        string db = gui->getDatabase();
        c = new MySqlConnection(host, user, password, db, port);
    }
    else
    {
        string dbFile = gui->getSqliteDbFile();
        c = new SqliteConnection(dbFile);
    }

}

GUI への依存を好まない場合は、Parameters という名前の構造体を定義し、GUI 入力に従ってそのインスタンスを更新し、このオブジェクトを接続ファクトリの接続生成メソッドに渡すことができます。

于 2013-04-15T12:19:24.337 に答える