- Windows 7 SP1
- MSVS 2010
- MongoDB 2.2.0
- Qt 4.8.4
编写单线程应用程序。我总是将 DBClientConnection 作为引用参数传递给任何需要访问 MongoDB 的函数。我可以改用全局变量,这样我就不必传递参数了吗?
这是在使用 Qt 的 QKeyEvent 时出现的。这是用这个原型(prototype)实现的:
void keyPressEvent(QKeyEvent * key_event);
重新实现:
void QWidget::keyPressEvent ( QKeyEvent * event )
我想从哪个函数调用 MongoDB 函数,但我无权访问 keyPressEvent 中的 DBClientConnection。因此,为什么我正在考虑使 DBClientConnection 成为全局性的。
最佳答案
推荐的解决方案是对数据库对象进行抽象。
Here is an explanation of the concept in C#
但是简单的说C++的话,目的就是定义一个接口(interface)。就这样。 IDatabase
或 IRepository
。
正如您所建议的,它或多或少具有全局值的作用,但是您将把它隐藏到 Factory
或 DependencyInjection
机制中...如果你真的想要的话,像 Singleton
这样的值。
但是具体的 class MyMongoDatabase
将实现连接内容,并指向真正的 mongoDb,应该用这个指针来打扰。不是您应用程序的其余部分。 最重要的是,如果它在 GUI 内部,例如您计划访问数据库的 QWidget::keyPressEvent。
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 操作的所有功能。背后的想法被称为“松散耦合”。
看看它是否值得编码。这取决于您在应用程序中执行此类操作的次数。一般来说,对于像数据库这样大的东西,这是一个非常好的主意。
关于c++ - 我可以(应该)将我的 DBClientConnection 用作全局变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16112169/