<分区>
有一个函数 Foo。 Foo 首先调用 Bar(),然后是一些语句,然后是 Walk(),然后是一些语句,然后是 Run(),然后是一些语句,然后是 Fly(),然后是一些语句。
此外,我不允许在我的代码中使用异常。因为我公司的代码标准。 :(
有几种方法,我可以编写 Foo(),如下所示。有些干净但不安全;有些真的很难看,但记录了所有日志。我真的很困惑。
哪个最好,你有更好的主意吗?
谁能帮帮我?
我从五个方向思考过这个问题:(clean[没有不必要的缩进]), (one return), (no goto), (print log), (check return value)。但我仍然很困惑。 goto真的有问题吗?是否需要记录所有内容?
图1 优点:干净。 缺点:没有日志并且不检查返回值。
int Foo()
{
Bar();
// aStatement;
Walk();
// bStatement;
Run();
// cStatement;
Fly();
// dStatement;
return;
}
图2 优点:清洁和日志。 缺点:多次返回。
int Foo() {
int status;
status = Bar();
if (!OK(status)) {
Log("...");
return status;
}
// aSatement
status = Walk();
if (!OK(status)) {
Log("...");
return status;
}
// bStatement
status = Run();
if (!OK(status)) {
Log("...");
return status;
}
// cStatement
status = Fly();
if (!OK(status)) {
Log("...");
return status;
}
// dSatement
return status;
}
图3 优点:清洁和日志。 缺点:转到问题。
int Foo() {
int status;
status = Bar();
if (!OK(status)) {
Log("...");
goto RETLINE;
}
// aSatement
status = Walk();
if (!OK(status)) {
Log("...");
goto RETLINE;
}
// bStatement
status = Run();
if (!OK(status)) {
Log("...");
goto RETLINE;
}
// cStatement
status = Fly();
if (!OK(status)) {
Log("...");
goto RETLINE;
}
// dSatement
RETLINE:
return status;
}
图4 优点:使用 do while,没有多次返回。 缺点:更多的缩进。
int Foo() {
int status;
do {
status = Bar();
if (!OK(status)) {
Log("...");
break;
}
// aStatement
status = Walk();
if (!OK(status)) {
Log("...");
break;
}
status = Run();
if (!OK(status)) {
Log("...");
break;
}
// cStatement
status = Fly();
if (!OK(status)) {
Log("...");
break;
}
// dStatement
} while(false);
return status;
}
图 5 优点:清洁和一次返回。 缺点:没有日志。
int Foo() {
int status;
status = Bar();
if (Ok(status)) {
status = Walk();
// aStatement
}
if (OK(status)) {
// bStatement
status = Run();
}
if (OK(status)) {
// cStatement
status = Fly();
}
if (Ok(status)) {
// dStatement
}
return status;
}
图6 优点:log & one return。 缺点:缩进更多。
int Foo() {
int status;
status = Bar();
if (!OK(status)) {
Log("...");
}
if (Ok(status)) {
// aStatement
status = Walk();
if (!OK(status)) {
Log("...");
}
}
if (OK(status)) {
// bStatement
status = Run();
if (!OK(status)) {
Log("...");
}
}
if (Ok(status)) {
// cStatement
status = Fly();
if (!OK(status)) {
Log("...");
}
}
if (Ok(status)) {
// dStatement
}
return status;
}
图7 优点:log & one return。 缺点:缩进更多。
int Foo() {
bool flag = true;
int status;
status = Bar();
if (!OK(status)) {
Log("...");
flag = false;
}
if (flag) {
// aStatement
status = Walk();
if (!OK(status)) {
Log("...");
flag = false;
}
}
if (flag) {
// bStatement
status = Run();
if (!OK(status)) {
Log("...");
flag = false;
}
}
if (flag) {
// cStatement
status = Fly();
if (!Ok(status)) {
Log("...");
flag = false;
}
}
if (flag) {
// dStatment
}
return status;
}