C++ 我是否可以(应该)将DBClientConnection用作全局变量? Windows 7 SP1 MSVS 2010 MongoDB 2.2.0 Qt 4.8.4

C++ 我是否可以(应该)将DBClientConnection用作全局变量? Windows 7 SP1 MSVS 2010 MongoDB 2.2.0 Qt 4.8.4,c++,qt,mongodb,C++,Qt,Mongodb,编写单线程应用程序。我总是将DBClientConnection作为引用参数传递给任何需要访问MongoDB的函数。我可以改用全局变量,这样就不必传递参数了吗 这是在使用Qt的QKeyEvent时出现的。这是通过以下原型实现的: void keyPressEvent(QKeyEvent * key_event); 重新实施: void QWidget::keyPressEvent ( QKeyEvent * event ) 我想从哪个函数调用MongoDB函数,但在keyPressEvent

编写单线程应用程序。我总是将DBClientConnection作为引用参数传递给任何需要访问MongoDB的函数。我可以改用全局变量,这样就不必传递参数了吗

这是在使用Qt的QKeyEvent时出现的。这是通过以下原型实现的:

void keyPressEvent(QKeyEvent * key_event);
重新实施:

void QWidget::keyPressEvent ( QKeyEvent * event )

我想从哪个函数调用MongoDB函数,但在keyPressEvent中我无权访问DBClientConnection。因此,我考虑将DBClientConnection作为一个全局连接

推荐的解决方案是数据库对象的抽象

<>但是简单地说,在C++中,目的是定义一个接口。就这些
IDatabase
IRepository

正如您所建议的,它或多或少具有全局值的作用,但您将其隐藏到
工厂
依赖注入
机制中。。。如果您确实需要,也可以使用全局值,如
单例

但是具体的
类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
};
MyMongoDatabase类:公共IDatabase { 私人: void connect(); 无效断开连接(); 公众: std::向量查询(int参数); 无效插入(另一项和另一项); //……其他积垢操作 };
在逻辑/业务代码中,您只能有:

IDatabase& database = getDatabase();
std::vector<Something> somethings = database.query_something();
IDatabase&database=getDatabase();
std::vector somethings=数据库.query_something();
IDatabase
将公开所有查询、插入和其他CRUD操作的函数。背后的想法被称为“松耦合”


看看它是否值得编码。这取决于您在应用程序中执行此类操作的时间。一般来说,对于像数据库这样大的东西,这是一个非常好的主意。

推荐的解决方案是对数据库对象进行抽象

<>但是简单地说,在C++中,目的是定义一个接口。就这些
IDatabase
IRepository

正如您所建议的,它或多或少具有全局值的作用,但您将其隐藏到
工厂
依赖注入
机制中。。。如果您确实需要,也可以使用全局值,如
单例

但是具体的
类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
};
MyMongoDatabase类:公共IDatabase { 私人: void connect(); 无效断开连接(); 公众: std::向量查询(int参数); 无效插入(另一项和另一项); //……其他积垢操作 };
在逻辑/业务代码中,您只能有:

IDatabase& database = getDatabase();
std::vector<Something> somethings = database.query_something();
IDatabase&database=getDatabase();
std::vector somethings=数据库.query_something();
IDatabase
将公开所有查询、插入和其他CRUD操作的函数。背后的想法被称为“松耦合”

看看它是否值得编码。这取决于您在应用程序中执行此类操作的时间。一般来说,对于像数据库这样大的东西,这是一个非常好的主意