我不确定这个帖子的最佳名称,但我正在尝试重构一些代码并删除一些解耦。我被迫在没有提升的情况下使用Visual Studio 2005 C ++,不要问...(所以不是c ++ 11,或者更新)
我有一个接收消息的协议,协议包含一个解析器和处理器。解析器从消息中提取信息,并填充结构。然后将结构传递到处理器以对其进行进一步操作。
class Protocol
{
Parser parser;
Processor processor;
public:
Protocol() : parser(processor)
{
}
handleMessage(Message& message)
{
ParsedData parsedData;
parser.parse(message, parsedData);
}
}
class Parser
{
Processor processor;
public:
Parser()
{
}
Parser(Processor& p) : processor(p)
{
}
parse(Message& message, ParsedData& parsedData)
{
if(message.type == "whatever")
{
parseLevel2(message.message, parsedData);
}
//else if Other message types
}
parseLevel2(MessageLevel2& message, ParsedData& parsedData)
{
//Keep going down the rabbit hole, but for simplicity it ends here
parsedData.blah = "some data";
processor.ProcessBlahMessage(parsedData);
}
}
class Processor
{
public:
Processor()
{
}
ProcessBlahMessage(ParsedData& parsedData)
{
//Do logic
}
}
我希望将处理器从解析器中删除,因此它变得更像这样......
class Protocol
{
Parser parser;
Processor processor;
public:
Protocol() : parser(processor)
{
}
handleMessage(Message& message)
{
ParsedData parsedData;
parser.parse(message, parsedData); //This will not call the processor from within it
processor.process(parsedData); //This is the new
}
}
阻止我这样做的唯一问题是我必须在process方法中有一堆if语句。
process(ParsedData& parsedData)
{
if(parsedData.type == "blah")
{
ProcessBlahMessage()
}
else if(parsedData.type == "grah")
{
ProcessGrahMessage()
}
//etc...
}
我的问题是如何避免所有那些我只是在解析它的if语句?如果我给parsedData一个函数指针或lambda,那么我仍然需要在解析器中引用处理器。
答案 0 :(得分:0)
你可以试试这个:
1)在您的解析数据中而不是.blah和.grah存储Date
2)假设创建新的blah对象(或任何消息类型)并将指针指向vector(使用type作为索引)。
3)在处理器存储处理程序的向量中。传入处理器类型以及解析数据,因此您可以为正确的指针调用正确的处理程序
4)在你的处理程序中将void *转换为blah *(或任何真正的类型)