编写单线程应用程序。我总是将DBClientConnection作为参考参数传递给任何需要访问MongoDB的函数。我可以使用全局变量,这样我就不必传递参数吗?
使用Qt的QKeyEvent时出现了这个问题。这是用这个原型实现的:
void keyPressEvent(QKeyEvent * key_event);
重新实现:
void QWidget::keyPressEvent ( QKeyEvent * event )
我想从哪个函数调用MongoDB函数,但是我无法访问keyPressEvent中的DBClientConnection。因此,我正在考虑将DBClientConnection设为全局。
答案 0 :(得分:1)
推荐的解决方案是数据库对象的抽象。
Here is an explanation of the concept in C#
但是简单地说它只是在C ++中,目的是定义一个接口。这就是全部。 IDatabase
或IRepository
。
它或多或少地具有您建议的全局值的作用,但您将其隐藏为Factory
或DependencyInjection
机制......或全局值,如{{1如果你真的想要。
但是具体的Singleton
将实现连接的东西,并指向真正的mongoDb应该打扰这个指针。不是你的应用程序的其余部分。 最重要的是,如果它在您的QWidget :: keyPressEvent之类的GUI内部,您计划访问数据库。
class MyMongoDatabase
在您的逻辑/商业代码中,您只能拥有:
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();
将公开查询,插入和其他CRUD操作的所有函数。背后的想法被称为松散耦合&#39;。
看看它是否值得编码。这取决于您在应用程序中执行此类操作的时间。一般来说,对于像数据库这样大的东西,这是一个非常好的主意。