2

我正在用 C++ 编写一个长时间运行的多线程服务器。它在套接字上接收请求,进行数据库查找并在套接字上返回响应。

服务器从配置文件中读取各种运行信息,包括数据库连接参数。我必须使用公司代码库中的数据库抽象类。我不想等到尝试进行数据库搜索以延迟实例化数据库连接(由于未显示复杂性,并且如果无法建立数据库连接,则需要在启动时退出错误)。

我的问题是如何将数据库连接信息放到搜索类中,而无需做任何技术上可行的“丑陋”或糟糕的 OOP 事情。我想学习如何正确地做到这一点。

是否有一个很好的设计模式来做到这一点?我应该使用“从上方参数化”模式吗?我错过了一些更简单的组合模式吗?

    // Read config file.
    // Open DB connection using config values.

    Server::process_request(string request, string response) {
        try {
            Process process(request);
            if (process.do_parse(response)) {
                return REQ_OK;
            } else {
                // handle error
            }
        } catch (..,) {
            // handle exceptions
        }
    }

    class Process : public GenericRequest {
    public:
        Process(string *input) : generic_process(input) {};
        bool    do_parse(string &output);
    }

    bool Process::do_parse(string &output) {
        // Parse the input request.
        Search search;      // database search object
        search.init( search parameters from parsing above );

        output = format_response(search.get_results());
    }

    class Search {
        // must use the Database library connection handle.
    }

如何将数据库连接从顶部的 Server 类获取到上面伪代码底部的 Search 类实例?

4

1 回答 1

1

您要解决的问题似乎是对象依赖之一,并且使用依赖注入可以很好地解决。

您的类Process需要一个 的实例Search,必须以某种方式对其进行配置。与其让实例Process分配他们自己的Search实例,不如让他们在构建时收到一个现成的实例会更容易。该类Process不必知道Search配置细节,因此避免了不必要的依赖。

但是随后问题会级联到必须创建的任何对象Process,因为现在这个对象必须知道配置细节!在您的情况下,这并不是真正的问题,因为Server该类是创建Process实例的类,并且它恰好知道Search.

但是,更好的解决方案是实现一个专门的类,例如DBService,它将封装从配置步骤获取的 DB 详细信息,并提供一种方法来获取现成的Search实例。使用此设置,没有其他对象将依赖于Search类的构造和配置。作为一个额外的好处,您可以轻松实现和注入一个DBService模型对象,这将帮助您构建测试用例。

class DBSearch {
    /* implement/extends the Search interface/class wrt DB */
};

class DBService {
    /* constructor reads up configuration details somehow: command line, file */

     Search *newSearch(){
         return new DBSearch(config); // search object specialized on db
     }

};

上面的代码在一定程度上说明了解决方案。请注意,该newSearch方法不限于仅构建一个Search实例,而是可以构建任何专门用于该类的对象(例如DBSearch上面的类)。依赖关系几乎从中删除Process,现在只需要知道Search它真正操作的接口。

这里强调的良好 OOP 设计的核心要素是减少对象之间的耦合,以减少修改或增强应用程序部分时所需的工作量,

请在 SO 上查找依赖注入,以获取有关该 OOP 设计模式的更多信息。

于 2013-01-31T01:58:56.713 回答