c ++使用switch / case解析protobuf消息(减少重复代码)

时间:2017-06-16 01:31:15

标签: c++ protocol-buffers code-duplication

我正在尝试构建从客户端解析protobuf数据包的服务器应用程序。

数据包处理代码如下:

在proto文件中,

package protocol;

message messageA
{
    ...
}

message messageB
{
    ...
}

message messageB
{
    ...
}

...

在代码文件中,

enum {
    messageTypeA = 1,
    messageTypeB, 
    messageTypeC, 
...
}

void ProcessPacket(int protocolID, char* packetData)
{
    string messageTypeString = "";

    switch(protocolID)
    {
        case messageTypeA : 
            protocol::messageA packet;

            packet.ParseFromArray(packetData, sizeof(padketData));

            messageTypeString = "messageA";

            ...    //kind of logging packet procedure

            break;
        case messageTypeB : 
            protocol::messageB packet;

            packet.ParseFromArray(packetData, sizeof(padketData));

            messageTypeString = "messageB";

            ...    //kind of logging packet procedure

            break;
        case messageTypeC : 
            protocol::messageC packet;

            packet.ParseFromArray(packetData, sizeof(padketData));

            messageTypeString = "messageC";

            ...    //kind of logging packet procedure

            break;
    }

    //using messageTypeString and so on..
}

正如我们所看到的,当数据包类型增长时,有很多重复的代码。

如何减少重复的代码?

有没有办法一次映射protocolID(enum value)packetmessageTypeString的类型?

1 个答案:

答案 0 :(得分:1)

我想你可以沿着这些方向做点什么:

std::map<int, std::unique_ptr<google::protobuf::Message>> protocols = {
  {messageTypeA, std::make_unique<protocol::messageA>()},
  {messageTypeB, std::make_unique<protocol::messageB>()},
  {messageTypeC, std::make_unique<protocol::messageC>()}
};

void ProcessPacket(int protocolID, char* packetData, int packetSize) {
  auto it = protocols.find(protocolID);
  assert(it != protocols.end());
  std::unique_ptr<google::protobuf::Message> packet{it->second->New()};
  packet->ParseFromArray(packetData, packetSize);
  std::string messageTypeString = packet->GetTypeName();
  //kind of logging packet procedure goes here
}

希望您的“日志记录程序”可以使用通用Message