1
  • 视窗 7 SP1
  • 2010 年
  • MongoDB 2.2.0
  • Qt 4.8.4

编写单线程应用程序。我总是将 DBClientConnection 作为引用参数传递给任何需要访问 MongoDB 的函数。我可以使用全局变量来代替传递参数吗?

这是在使用 Qt 的 QKeyEvent 时出现的。这是用这个原型实现的:

void keyPressEvent(QKeyEvent * key_event);

重新实现:

void QWidget::keyPressEvent ( QKeyEvent * event )

我想从哪个函数调用 MongoDB 函数,但我无权访问 keyPressEvent 中的 DBClientConnection。因此,为什么我正在考虑将 DBClientConnection 设为全局。

4

1 回答 1

1

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

这是C#中概念的解释

但简单地说,C++ 的目的是定义一个接口。就这样。IDatabaseIRepository

正如您所建议的那样,它或多或少具有全局值的作用,但如果您真的想要,您会将其隐藏到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 操作的功能。背后的想法被称为“松散耦合”。

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

于 2013-04-19T19:52:03.243 回答