不用 goto 重构代码
Refactor code without goto
我有点困惑。如何在没有 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
时执行
您可以改写如下:
if(first_expression)
{
// ....
if(second_expression)
{
// ....
}
}
if(!first_expression || (first_expression && !second_expression))
{
}
我对你的代码一无所知,但你可以这样做:
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;
}
你走在正确的轨道上。我会将其简化为:
bool succeeded = false;
if(first_expression)
{
if(second_expression)
{
succeeded = true;
// ....
}
}
if(!succeeded)
{
// ....
}
我有点困惑。如何在没有 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
您可以改写如下:
if(first_expression)
{
// ....
if(second_expression)
{
// ....
}
}
if(!first_expression || (first_expression && !second_expression))
{
}
我对你的代码一无所知,但你可以这样做:
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;
}
你走在正确的轨道上。我会将其简化为:
bool succeeded = false;
if(first_expression)
{
if(second_expression)
{
succeeded = true;
// ....
}
}
if(!succeeded)
{
// ....
}