我正在以XML格式解析和存储从服务器获取的数据。该应用程序是一个瘦客户端,非常频繁地要求这样的服务器端数据。一些变量将是uris,触发更多的网络调用。数据格式如下:
<object>
<var1>value</var1>
...
<varN>value</varN>
</object>
对象中有~50个变量。该对象由MyObject类镜像,该类具有所有变量的getter和setter(它们具有不同的类型,并且可以被各种其他类访问)。
我一直在使用QXmlStreamReader这很好,但我最终得到了很多
if (reader.name() == "var1")
{
...
}
条目,我认为必须有更好的方法?
我编写了一些快速的原型代码,其中MyObject有一个函数,它将(name, entry)
和name
的索引转换为函数指针的QHash,它将setter返回到entry,它调用它传递{{ 1}}。这感觉不是Qt-ish,并且会像将来可能混淆未来的维护者那样:
在标题中:
entry
的.cpp:
typedef void (Foo::*setValue)(QString& value);
QHash<QString, Foo::setValue> m_settersMap;
并从XML处理程序:
MyObject::MyObject(QObject *parent) :
QObject(parent)
{
m_settersMap["var1"] = &MyObject::setVar1;
m_settersMap["var2"] = &MyObject::setVar2;
...
m_settersMap["varN"] = &MyObject::setVarN;
}
void MyObject::set(QString &name, QString &entry)
{
MyObject *foo = this;
MyObject::setValue setter;
setter = m_settersMap.value(key);
(*foo.*setter)(value);
}
void MyObject::setVar1(QString &entry)
{
m_foo1 = entry;
}
...
这种方式在XML处理程序中减少了copy-pasta,但是增加了QHash的开销和非直接实现的可能混淆(我怀疑这不是这样做的方法)。
这是合法的还是疯狂的,我是否错过了一些令人眼花缭乱的事情?
答案 0 :(得分:1)
我建议您使用另一个“更简单”的解决方案来帮助您:
1)拥有更少的代码并使您的代码可读 2)不要用函数调用来压倒另一个对象
所以你可以使用QObject properties来做到这一点。您的代码看起来就像:
// parsing the XML here via QXmlStreamReader
...
QObject *object = new QObject;
...
object->setProperty(reader.name(), reader.value());
然后你可以在代码中引用你对象的变量,如下所示:
QString name = object->property("var1").toString();
您可能希望扩展QObject以摆脱调用.toString()或类似的东西的必要性。