我不确定这个线程的最佳名称,但我正在尝试重构一些代码并删除一些解耦。我被迫在没有boost的情况下使用Visual Studio2005 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,那么我仍然需要在解析器中引用处理器。
发布于 2017-01-19 08:05:33
你可以尝试这样做: 1)在你解析的数据中而不是.blah和.grah中存储vector<void*>
2)假设创建新的blah对象(或任何消息类型),并将指向它的指针放入向量(使用类型作为索引)。3)在处理器中存储处理程序的向量。与解析的数据一起传递给处理器类型,这样你就可以在你的处理程序中为正确的指针调用正确的处理程序4)将void*转换为blah* (或者任何真实的类型)
https://stackoverflow.com/questions/41732548
复制相似问题