推奨される解決策は、データベース オブジェクトの抽象化です。
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 操作であるすべての関数を公開します。背後にある考え方は「疎結合」と呼ばれます。
コーディングする価値があるかどうかを見てください。アプリケーションでそのようなことを行う回数によって異なります。一般に、データベースのような大規模なものでは、これは非常に良いアイデアです。