1
  • ウィンドウズ 7 SP1
  • MSVS 2010
  • モンゴ DB 2.2.0
  • Qt 4.8.4

シングルスレッド アプリケーションの作成。MongoDB へのアクセスが必要な関数には、常に DBClientConnection を参照引数として渡します。引数を渡す必要がないように、代わりにグローバル変数を使用できますか?

これは、Qt の QKeyEvent を使用したときに発生しました。これは、次のプロトタイプで実装されています。

void keyPressEvent(QKeyEvent * key_event);

再実装:

void QWidget::keyPressEvent ( QKeyEvent * event )

どの関数から MongoDB 関数を呼び出したいのですが、keyPressEvent 内の DBClientConnection にアクセスできません。したがって、DBClientConnection をグローバルにすることを検討している理由です。

4

1 に答える 1

1

推奨される解決策は、データベース オブジェクトの抽象化です。

C# での概念の説明は次のとおりです。

しかし、C++ で簡単に言えば、目的はインターフェイスを定義することです。それで全部です。IDatabaseまたはIRepository

あなたが示唆するように、多かれ少なかれグローバル値の役割を果たしますが、それをFactory、またはDependencyInjectionメカニズム...またはSingleton本当に必要な場合のようなグローバル値に隠します。

しかしclass MyMongoDatabase、接続スタッフを実装し、このポインターを気にする必要がある実際のmongoDbを指すのは具象です。アプリケーションの残りの部分ではありません。とりわけ、データベースにアクセスする予定の QWidget::keyPressEvent のような GUI 内にある場合

class MyMongoDatabase : public IDatabase
{
    private:
        void connect();
        void disconnect();

    public:
        std::vector<Something> query_something(int param);
        void insert(AnOtherThing& thing);
        //.... other crud operations
};

あなたのロジック/ビジネスコードでは、次のものしか持てませんでした:

IDatabase& database = getDatabase();
std::vector<Something> somethings = database.query_something();

またIDatabase、クエリ、挿入、およびその他の CRUD 操作であるすべての関数を公開します。背後にある考え方は「疎結合」と呼ばれます。

コーディングする価値があるかどうかを見てください。アプリケーションでそのようなことを行う回数によって異なります。一般に、データベースのような大規模なものでは、これは非常に良いアイデアです。

于 2013-04-19T19:52:03.243 に答える