【问题标题】:Refactor code without goto无需 goto 即可重构代码
【发布时间】:2016-08-10 04:47:31
【问题描述】:

我有点困惑。如果没有goto,如何重构这个语句?

if(first_expression)
{
    // ....
    if(second_expression)
    {
        // ....
    }
    else
    {
        goto jump_out;
    }
}
else
{
    jump_out:
    // ....
}

这是好方法吗?

bool expressionFailed = false;
if(first_expression)
{
    if(second_expression)
    {
        // ....
    }
    else
        expressionsFailed = true;
}
else
    expressionsFailed = true;

if(expressionsFailed)
{
    // ....
}

我不能使用&&,因为if(first_expression)之后的代码需要在second_expression = false时执行

【问题讨论】:

  • 是的,看起来不错。
  • 你写的代码没问题
  • 使用 break 而不是 goto。

标签: c++ refactoring goto


【解决方案1】:

我对您的代码一无所知,但您可以这样做:

void on_error ()
{
  //error stuff
}

int main ()
{
    if(first_expression)
    {
        if(second_expression)
        {
            // ....
        }
        else
            on_error();
    }
    else
        on_error();
}

甚至更好:

void job()
{
    if(first_expression)
    {
        if(second_expression)
        {
            // ....
        }
        else
            throw;
    }
    else
        throw;
}

int main () {
  try
  {
    job();
  }
  catch ()
  {
    // err stuff 
  }
  return 0;
}

【讨论】:

    【解决方案2】:

    你在正确的轨道上。我将其简化为:

    bool succeeded = false;
    if(first_expression)
    {
        if(second_expression)
        {
           succeeded = true;
           // ....
        }
    }
    
    if(!succeeded)
    {
       // ....
    }
    

    【讨论】:

    • 对我来说是最好的情况
    【解决方案3】:

    你可以改写如下:

    if(first_expression)
    {
        // ....
        if(second_expression)
        {
            // ....
        }
    }
    if(!first_expression || (first_expression && !second_expression))
    {
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-10
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      • 2015-11-11
      相关资源
      最近更新 更多