在一个项目的源代码中,我看到一个 300 行的 switch/case 子句。但它的结构非常好,因为每个案例都是这样的:
case X:
{
msg_type_for_X msg;
if (msg.ParseFromArray (m_readBuffer))
recv_X (msg);
}
break;
这让我想把它写成 20 行。这里对于每个案例 X
,类 msg_type_for_X
是由 protobuf 定义的类。对我来说这似乎很棘手,因为编译器无法知道 msg 的类型。那么人们将如何重构这样的东西呢?或者人们只是不管它?
最佳答案
您可以在宏中使用 token 粘贴。看here .
它会是这样的:
#define CASE_MSG(X) \
case X: \
{ \
msg_type_for_##X msg; \
if (msg.ParseFromArray (m_readBuffer)) \
recv_##X (msg); \
} \
break;
还有其他方法可以做这种事情,并且有一个 msg_type_for_X 结构数组,您将它们全部初始化,然后您甚至不需要使用 case:
if (messages[X].ParseFromArray(m_readBuffer))
messages[X].recv(msg);
当然,它需要一些重构才能将 recv_X
作为消息解析器的方法包含在内。
关于c++ - 抽象/重构此开关/案例的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22993454/