gpt4 book ai didi

c++ - 在 C++ 中建模变量成员类型

转载 作者:行者123 更新时间:2023-11-30 04:19:44 28 4
gpt4 key购买 nike

我目前有一个运行代码,用于通过给定的 API (libpq) 连接到数据库。

我基本上有两个类:主要应用程序类 CMain 和数据库相关类(负责连接到数据库、发出查询和存储结果)称为 CDbConnectorPq。

在我的 CMain 构造函数中,我目前实例化了一个 CDbConnectorPq 类型的类成员,然后我使用该对象直接从我的 CMain 对象触发连接和查询:

main->dbConnectorPq->connect();

问题是除了 libpq 之外,我现在还需要实现另一个 API 来连接到数据库 (ODBC)。我试图弄清楚什么可能是一个体面的建模来保持 libpq 代码与 odbc 代码的分离,但仍然使用与我的主要对象完全相同的接口(interface)。

我考虑过继承,但我最终得到了 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>连接(...);

或者(如果 gl_use_config = ODBC) dbConnector->setType(gl_use_config); dbConnector->connect(param1,param2); dbConnector>connect(query1,query2);

因为是的,PQ 和 ODBC 之间的参数编号在数量和类型上可能不同......

那么,对于这种情况,什么是智能建模?

最佳答案

这不会是您的典型 SO 答案,但这是我对此的感受。在过去的 15 年里,我用 OCI、OCCI、OTL、RogueWave、libpq 和 libpqxx 为不同的公司编写了多个数据库层,我的建议是:不要这样做。说真的。

要么只使用 ODBC,甚至连接到 PostgreSQL(我个人不喜欢),要么你应该开发两个完全分离的数据库访问层。如果你试图统一接口(interface)和使用,你会面临很多问题,需要多年的经验。即便如此,对于每个新项目,您都会发现另一个问题,并且界面的更改频率会超出您的预期。

如果您想开发单独的层,您可以做一些事情来简化应用程序从一个层到另一个层的移植:

  • 尽可能让它们相似,但不要强制!
  • 如果两个层具有相同的功能和相同的语义,则使用相同的名称。
  • 如果两个层具有相同的功能但语义不同,则使用不同的名称。
  • 在使用数据库层的应用程序中,使用包含数据库 header 的一个 header ,并通过typedef 使用它们,或者更好的是,使用 namespace 别名。

有了这个,移植变得更容易了。当您将应用程序从一层移植到另一层时,更改 header 中的 typedef 或命名空间别名,让编译器帮助您找到需要手动调整的内容。

关于c++ - 在 C++ 中建模变量成员类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15671645/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com