在这种情况下如何解耦
How to decouple in this case
例如,以下代码片段执行以下操作:首先从数据库中读取数据,然后转换数据,最后将结果写回数据库。更具体地说:
- 从数据库中读取数据,并逐条记录将其存储到 A 类中。
- 逐条记录转换存储在 A 类中的数据,B 类执行此工作。
- 将所有结果存储在 QVariantList 中,并将它们批量写入 ihe 数据库。
问题是 A 类、B 类和 ReadTransWrite 类之间的紧密耦合如果我想将成员变量 A4 添加到类 A 中,则需要更改 3 个类。请参阅以"//-->"开头的注释
如何解耦? 推荐任何模式吗? 有什么建议吗?
片段:
class A {
public:
void trans(QSqlQuery query){
A1 = query.record().field("A1").value().toString();
A2 = query.record().field("A2").value().toDate();
A3 = query.record().field("A3").value().toInt();
//--> A4 = query.record().field("A4").value().toDouble();
}
public:
QString A1;
QDate A2;
int A3;
//--> double A4;
};
class B {
public:
void trans(const A& a){
B1 = A1;
B2 = A2;
B3 = A3;
//--> B4 = A4;
}
public:
QString B1;
QDate B2;
int B3;
//--> double B4;
};
class ReadTransWrite {
.....
void do();
.....
}
void ReadTransWrite::do(){
....
// prepare for batch insert into the database
QVariantList B1s;
QVariantList B2s;
QVariantList B3s;
//--> QVariantList B4s;
A a; // read record by record from data base
B b; // transform the results record by record
QString sql_read = "select A1, A2, A3 from table0";
//--> QString sql_read = "select A1, A2, A3, A4 from table0";
QSqlQuery query_read;
query_read.exec(sql_read);
while(query_read.next()){
a.trans(query_read); // read record by record from data base
b.trans(a); // transform the results record by record
B1s.push_back(b.B1);
B2s.push_back(b.B2);
B3s.push_back(b.B3);
//--> B4s.push_back(b.B4);
}
QSqlQuery query_write;
QString sql_write = "insert into table (B1, B2, B3) values (:B1, :B2, :B3)";
//--> QString sql_write = "insert into table (B1, B2, B3, B4) values (:B1, :B2, :B3, :B4)";
query_write.prepare(sql_write);
query_write.bindValue(":B1",B1s);
query_write.bindValue(":B2",B2s);
query_write.bindValue(":B3",B3s);
//--> query_write.bindValue(":B4",B4s);
query_write.execBatch();
}
你可以像这样做A类:
#include <QtCore/QVariant>
#include <QtSql/QSqlRecord>
class A
{
public:
void fillFromRecord( const QSqlRecord& record )
{
for( int iColumn = 0; iColumn < record.count(); iColumn++ )
{
_contentMap.insert(
record.fieldName( iColumn ),
record.value( iColumn )
);
}
}
inline QVariantMap getContentMap() const { return _contentMap; }
private:
QVariantMap _contentMap;
};
注意:我没有测试该代码的编译错误,但它至少应该给你一个大致的想法。这样,每当数据库更改时,类 A 将永远不会更改。
还要注意如何只要求QSqlRecord
而不是QSqlQuery
,以更多地致力于sehe
评论中链接的得墨忒耳定律。
您可以根据需要更改映射的类型,例如 QHash<int、QVariant>,它只存储列索引而不是名称,并且不需要额外的 QMap 功能(基本上排序)可能也足够了。
相关文章:
- TSP递归解的迭代形式
- 我应该在锁定TBitmap画布后解锁它吗
- 使用C++进行运行长度解压缩
- 当算法需要派生类的知识时,将算法与数据解耦
- 将GUI与解析引擎解耦
- 解耦嵌套类:使用模板别名时出现"模板声明冲突"错误
- 在这种情况下如何解耦
- hash_map/unordered_map 的解耦版本
- C++或D:在没有动态调度的情况下解耦类的习惯用法
- 在解耦的设计层之间高效地传递通知
- 从接口(c++)解耦表示的含义
- 如何将客户端类与模板类解耦
- 在C++中,如何最好地解耦两个必须维护彼此引用集合的类
- 将异常与日志格式解耦
- 发布解耦嵌套c++类
- 解耦应用程序和库在CMake项目
- 以有状态策略类为代价解耦宿主类和策略类,并且不遵循Effective c++的第26条
- 如何获得解耦的多态行为
- 将线程逻辑与业务逻辑解耦
- c++回调——如何解耦回调类型