Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 摆脱if-else并切换到c++;_C++_Oop_Design Patterns - Fatal编程技术网

C++ 摆脱if-else并切换到c++;

C++ 摆脱if-else并切换到c++;,c++,oop,design-patterns,C++,Oop,Design Patterns,我有这些很长的if-else/switch语句,非常长,它们使代码很难阅读。所以我只是想知道有没有办法摆脱他们?可能是对每个条件使用一个类,然后使用责任链模式 你建议采取什么样的方法 下面是一个示例代码: if ( cc == LIB_DEFINED_CONSTANT_1 ) { response = "-1"; errorWindow->setText ( "The operation timed out.\nPlease try

我有这些很长的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设置文本


编辑:如果人们可以就他们为什么投了反对票留下评论,那就太好了。

一般来说,你应该尝试将你的代码分成几个小函数/方法,每个函数/方法应该只做一件事。如果If/else块很长(几页),您可能应该重构代码

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

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

如果可能的话,我试着让我的代码看起来像那样。在大型应用程序中,滚动几个页面只是为了检查
else
中的操作是一个真正的难题。。。一个人的头脑。

这取决于他们解决了什么问题,但这可能是可以用数组、地图或状态机解决的问题。谁知道。。。没有看到代码,或者至少没有更全面的解释,说明测试的条件是什么,每个受控块中执行的代码是什么。没有代码,我不知道。在你的问题中放一个最小的样本,比如说2或3个你的条件。在没有更多上下文的情况下,您不会得到太多的答案。在您的示例中,除了字符串的内容之外,您正在复制所有内容。从消除重复开始,即分解出与单个位置完全相同的行。您将得到一个错误代码和字符串描述的表格,您将能够解决这个特定的问题。我认为这个问题应该放在更合适的位置,因为代码正在以它应该的方式工作(据我从您的问题中所看到的),并且您正在寻求改进建议。我认为@DanielDaranas给出了迄今为止最有用的提示:将错误代码存储在一个数组中(最好是
std::vector
),并将相应的错误消息存储在另一个数组中(
std::vector
),或者创建一个包含错误代码和消息的
struct
,并将它们全部放入一个数组中。细节留给读者作为练习;)我认为这并没有解决问题,因为它特别要求去掉if/else语句。@Piotr99他想要去掉“非常长”的语句,这些语句“使代码难以阅读”。我的回答涉及这些问题。