如何解决XML解析后用于变量设置的函数指针的QHash:疯狂吗?
| 我正在解析和存储从服务器以XML格式获取的数据。该应用程序是一个瘦客户机,它非常频繁地请求这样的服务器端数据。某些变量将是uri触发更多的网络调用。数据格式为:<object>
<var1>value</var1>
...
<varN>value</varN>
</object>
对象中有约50个变量。该对象由MyObject类镜像,该类具有用于所有变量的getter和setter(类型不同,并且将由其他各种类访问)。
我一直在使用QXmlStreamReader,这很好,但最终我得到了很多
if (reader.name() == \"var1\")
{
...
}
条目,我想必须有更好的方法吗?
我写了一些快速的原型代码,其中MyObject有一个使用(name,entry)
的函数,并按name
索引到函数指针的QHash中,该函数将setter返回到条目,它称为传递entry
。这感觉不合Qt风格,并且可能会使将来的维护者感到困惑:
在标题中:
typedef void (Foo::*setValue)(QString& value);
QHash<QString,Foo::setValue> m_settersMap;
.cpp:
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处理程序中:
MyObject foo;
...
if(reader.isStartElement())
{
foo.set(reader.name(),reader.readEntryText());
}
这样,XML处理程序中的复制粘贴就更少了,但是QHash的开销增加了,而且非直截了当的实现可能会造成混淆(我na的怀疑是,这不是The Way To Do It) 。
那么这是合法的还是疯狂的,我错过了令人眼花obvious乱的明显事物吗?
解决方法
我建议您使用另一个“更轻松”的解决方案,该解决方案将帮助您:
1)减少代码数量并使代码可读
2)不要让函数调用淹没其他对象
因此,您可以使用QObject属性来执行此操作。您的代码看起来像以下简单:
// parsing the XML here via QXmlStreamReader
...
QObject *object = new QObject;
...
object->setProperty(reader.name(),reader.value());
然后,您可以在代码中引用对象的变量,如下所示:
QString name = object->property(\"var1\").toString();
您可能需要扩展QObject,以摆脱一直调用.toString()或类似方法的必要性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。