我目前有一个正在运行的代码,用于通过给定的 API (libpq) 连接到数据库。
我基本上有两个类:主应用程序类CMain,和数据库相关类(负责连接数据库、发出查询和存储结果)称为CDbConnectorPq。
在我的 CMain 构造函数中,我目前实例化了一个 CDbConnectorPq 类型的类成员,然后我使用该对象直接从我的 CMain 对象触发连接和查询:
main->dbConnectorPq->connect();
问题是除了 libpq 之外,我现在还需要实现另一个 API 来连接到数据库 (ODBC)。我试图弄清楚什么可能是一个体面的建模,以将 libpq 代码与 odbc 代码分开,但仍然使用与我的主要对象完全相同的接口。
我考虑过继承,但最终我得到了 2 个类,CDbConnectorPq 和 CDbConnectorODBC,然后我现在主要有两个成员:一个用于 libpqxx,一个用于 odbc,并且被迫:
if ( gl_use_config_odbc )
dbConnectorOdbc = new CDbConnectorODBC();
else if ( gl_use_config_libpq )
dbConnectorPq = new CDbConnectorPq();
进而 :
if ( gl_use_config_odbc ) {
dbConnectorOdbc->connect();
dbConnectorOdbc->query();
}
else if ( gl_use_config_pq ) {
dbConnectorPq->connect();
dbConnectorPq->query();
}
不知道如何在这里利用继承来掩盖我的主要对象中的 API 特定逻辑。
理想情况下,界面应该是(我认为):
(如果 gl_use_config = PQ) dbConnector->setType(gl_use_config); dbConnector->connect(....); dbConnector>connect(...);
或 ( 如果 gl_use_config = ODBC ) dbConnector->setType(gl_use_config); dbConnector->connect(param1,param2); dbConnector>连接(查询1,查询2);
因为是的,参数编号在 PQ 和 ODBC 之间的数量和类型可能不同......
那么,对于这种情况,什么是智能建模?