XML解析后变量设置的函数指针的QHash:疯了吗?

时间:2011-04-13 12:25:27

标签: c++ qt

我正在以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的开销和非直接实现的可能混淆(我怀疑这不是这样做的方法)。

这是合法的还是疯狂的,我是否错过了一些令人眼花缭乱的事情?

1 个答案:

答案 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()或类似的东西的必要性。