c++ - 我可以(应该)将我的 DBClientConnection 用作全局变量吗?

标签 c++ qt mongodb

  • 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)。就这样。 IDatabaseIRepository

正如您所建议的,它或多或少具有全局值的作用,但是您将把它隐藏到 FactoryDependencyInjection 机制中...如果你真的想要的话,像 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/

相关文章:

c++ - 将派生对象存储在基本类型的 vector 中

c++ - 将任意长度的 float 舍入到 n 位

c++ - QT Creator 错误(与 operator+ 不匹配)

c++ - 在原生 C/C++ 中使用 Qt 绘制二维码

c++ - QT 样式注释(智能感知?)

node.js - Redis 中的复杂数据结构

c++ - 使用作为类成员的类模板

c++如何从函数中的 vector 中删除对象

mongodb - 如何在 mongodb 聚合中将 ISO 日期转换为 unix 纪元

php - Laravel Mongodb 带日期的原始 mongo 查询