首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何成功地解耦这些类

如何成功地解耦这些类
EN

Stack Overflow用户
提问于 2017-01-19 02:02:20
回答 1查看 134关注 0票数 1

我不确定这个线程的最佳名称,但我正在尝试重构一些代码并删除一些解耦。我被迫在没有boost的情况下使用Visual Studio2005 C++,不要问...(所以不是c++11,也不是更新版本)

我有一个接收消息的协议,该协议包含一个解析器和处理器。解析器从消息中提取信息,并填充结构。然后将该结构传递给处理器,以便对其采取进一步的操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
    }
}

我希望从解析器中剥离处理器,这样它就更像这样了……

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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语句。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
process(ParsedData& parsedData)
{
    if(parsedData.type == "blah")
    {
        ProcessBlahMessage()
    }
    else if(parsedData.type == "grah")
    {
        ProcessGrahMessage()
    }
    //etc...
}

我的问题是,我如何避免所有那些本质上只是再次解析它的if语句?如果我给parsedData一个函数指针,或者lambda,那么我仍然需要在解析器中引用处理器。

EN

回答 1

Stack Overflow用户

发布于 2017-01-19 08:05:33

你可以尝试这样做: 1)在你解析的数据中而不是.blah和.grah中存储vector<void*> 2)假设创建新的blah对象(或任何消息类型),并将指向它的指针放入向量(使用类型作为索引)。3)在处理器中存储处理程序的向量。与解析的数据一起传递给处理器类型,这样你就可以在你的处理程序中为正确的指针调用正确的处理程序4)将void*转换为blah* (或者任何真实的类型)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41732548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文