【问题标题】:Getting rid of if-else and switch in c++ [closed]摆脱 if-else 并在 C++ 中切换 [关闭]
【发布时间】:2013-06-27 09:24:23
【问题描述】:

我有这些很长的 if - else/switch 语句,真的很长,而且它们使代码难以阅读。所以只是想知道有没有办法摆脱它们?也许像为每个条件使用一个类,然后使用责任链模式?

你会建议什么样的方法?

这是一个示例代码:

    if (  cc == LIB_DEFINED_CONSTANT_1  )
    {

        response = "-1";

        errorWindow->setText ( "The operation timed out.\nPlease try again later." );
        errorWindow->show (  );

    }   

    else if (  cc == LIB_DEFINED_CONSTANT_2  )
    {

        response = "-1";

        errorWindow->setText ( "Couldn't conect to the server.\nPlease try again later." );
        errorWindow->show (  );

    }

    else if (  cc == LIB_DEFINED_CONSTANT_3  )
    {

        response = "-1";

        errorWindow->setText ( "Access is denied.\nPlease contact our support team." );
        errorWindow->show (  );

    }

    else if (  cc == LIB_DEFINED_CONSTANT_4  )
    {

        response = "-1";

        errorWindow->setText ( "Credentials and varified\nPlease contact our support team." );
        errorWindow->show (  );

    }
    else if ....

如您所见,条件标签中的大部分代码都有些类似,除了为errorWindow设置文本。

编辑: 如果人们可以就他们投反对票的原因发表评论,那就太好了。

【问题讨论】:

  • 这取决于他们解决什么问题,但可能是可以通过数组、地图或状态机解决的问题。
  • 谁知道......没有看到代码,或者至少没有更全面的解释来说明正在测试的条件是什么以及每个受控块中正在执行什么代码。
  • 没有代码,我不知道。在你的问题中放一个最小的样本,比如你的 2 或 3 个条件。如果没有更多上下文,您将不会得到太多答案。
  • 在你的例子中,你复制了 everything 除了字符串的内容。从消除重复开始,即分解出与单个位置完全相同的行。您将看到一个错误代码和字符串描述表,您将能够解决那个特定问题。
  • 我认为这个问题最好放在codereview.stackexchange.com ,因为代码正在以它应该的方式工作(据我从你的问题中可以看出),并且你正在寻求建议进行改进。我认为@DanielDaranas 给出了迄今为止最有用的提示:将错误代码存储在一个数组中(最好是std::vector),并将相应的错误消息存储在另一个数组中(std::vector<std::string>),或者创建一个包含错误代码的struct和消息,并将它们全部放入一个数组中。细节留给读者作为练习;)

标签: c++ oop design-patterns


【解决方案1】:

一般来说,您应该尝试将代码拆分为小的函数/方法,并且每个函数/方法都应该只做一件事。如果你有一个很长(几页)的 if/else 块,你应该重构你的代码

我认为代码应该是这样的:

if (shouldIdoThing1()) 
{
  doThingOne(withThis, andThis, andThat);
}
else if (shouldIdoThing2())
{
  doTheSecondThing(withThisOnly);
} 
else
{
  doTheOtherThing(withSomethingElseEntirelyPerhaps);
}

如果可能的话,我会尽量让我的代码看起来像这样。在大型应用程序中,滚动浏览多个页面只是为了检查 else 中所做的事情,真是让人头疼。

【讨论】:

  • 我认为这并没有解决问题,因为它特别要求摆脱 if/else 语句。
  • @Piotr99 他想摆脱“使代码难以阅读”的“非常长”的语句。我的回答解决了这些问题。
猜你喜欢
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 2022-01-02
  • 1970-01-01
  • 2010-10-12
  • 2018-03-29
  • 2013-06-14
相关资源
最近更新 更多