推荐的解决方案是您的数据库对象的抽象。
这是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 操作的功能。背后的想法被称为“松散耦合”。
看看它是否值得编码。这取决于您在应用程序中执行此类操作的次数。一般来说,对于像数据库这样大的东西,这是一个非常好的主意。