2016-08-10 4 views
1

Ich bin ein wenig verwirrt. Wie kann diese Aussage ohne goto refaktoriert werden?Refactor code ohne goto

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

Ist das ein guter Weg?

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

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

Ich kann && nicht verwenden, da Code nach if(first_expression) Bedarf ausgeführt werden, wenn second_expression = false

+1

Ja, das sieht gut aus. – Amadan

+1

Der Code, den Sie geschrieben haben, ist in Ordnung – naffarn

+0

Verwenden Sie Pause statt Goto. – MarcusJ

Antwort

2

Sie sind auf dem richtigen Weg. Ich würde es vereinfachen zu:

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

if(!succeeded) 
{ 
    // .... 
} 
+0

Es ist das beste für mich – Inline

0

Sie können es wie folgt umschreiben:

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

Ich weiß nichts über Ihren Code aber Sie könnten das tun:

void on_error() 
{ 
    //error stuff 
} 

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

oder noch besser:

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

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