如何成功解耦这些类

时间:2017-01-19 02:02:20

标签: c++ design-patterns

我不确定这个帖子的最佳名称,但我正在尝试重构一些代码并删除一些解耦。我被迫在没有提升的情况下使用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,那么我仍然需要在解析器中引用处理器。

1 个答案:

答案 0 :(得分:0)

你可以试试这个: 1)在您的解析数据中而不是.blah和.grah存储Date 2)假设创建新的blah对象(或任何消息类型)并将指针指向vector(使用type作为索引)。 3)在处理器存储处理程序的向量中。传入处理器类型以及解析数据,因此您可以为正确的指针调用正确的处理程序 4)在你的处理程序中将void *转换为blah *(或任何真正的类型)