gpt4 book ai didi

c++ - 在这种情况下如何解耦

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:42 30 4
gpt4 key购买 nike

例如,下面的代码片段做了这些事情:首先从数据库中读取数据,然后转换数据,最后将结果写回数据库。更具体地说:

  1. 从数据库中读取数据,逐条记录存入A类记录。
  2. 按记录转换存储在 A 类中的数据,B 类完成此工作。
  3. 将所有结果存入QVariantList,批量写入数据库。

问题是类A、类B和类ReadTransWrite之间的紧耦合如果我想在A类中增加一个成员变量A4,需要改变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 功能(基本上排序)可能就足够了好吧。

关于c++ - 在这种情况下如何解耦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13582702/

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