3

我有一个 Server 类,它处理QJsonObject数据并根据数据中的键集进行处理。

目前,我使用一个大的 if-then-else 语句来决定像这样做什么:

const QString action = jsonObject.value(KEY_ACTION).toString();
if (action == SOME_ACTION) {
    // do something
} else if (action == SOME_OTHER_ACTION) {
    // do something else
}

等等。现在,与此同时,我有很多操作,对于每一个操作,我的服务器都必须检查所有案例,直到找到正确的案例。因此,我想知道是否有更好的方法来做到这一点。

我考虑过在不同的函数中进行数据处理,并QHash为每个操作使用相应的函数指针指向相应的函数,如下所示:

在构造函数中:

const QHash<QString, void(Server::*)(const QJsonObject &)> processFunctionsMap {
    { SOME_ACTION, &Server::processSomeAction },
    { SOME_OTHER_ACTION, &Server::processSomeOtherAction }
}

以及各自的功能:

void Server::processSomeAction(const QJsonObject &data)
{
    ...
}

然后调用匹配函数:

if (! processFunctionsMap.contains(action)) {
    // Catch this case
}
(this->*processFunctionsMap.value(action))(jsonObject);

这似乎可行,但我不是 C++ 专业人士,所以我的问题是这是否是正确的方法。

4

1 回答 1

2

您的方法是合理的,但是您已经将不匹配场景从执行一个else块(可能什么都不做)更改为即时未定义的行为。

您需要将哈希查找与调用分开,以便您可以在两者之间插入成功查找的检查。使用 C++ 标准集合(std::map它是一个红黑树,它是一个哈希表),这将是一个返回迭代器std::unordered_map的调用......你将它与它进行比较并确保如果它们相等则不要取消引用。 ,或任何其他非标准哈希表,肯定会提供类似的东西。find(key)map.end()QHash

于 2019-08-12T18:26:55.297 回答