【发布时间】:2020-08-17 17:54:24
【问题描述】:
我有一个带有某种回调机制的状态机,函数由任务运行程序调用。这一切的背后是一个状态机,它有4种状态,有的相互排斥,有的可以组合,形成了相当复杂的规则集。如果尝试任何非法操作,其中一项功能应向用户显示错误消息(为简单起见,printf 此处):
static int state1 = 0;
static bool switch2 = 1;
void do_stuff(int value){
int errorCode = 0;
if(state1 == 1){
errorCode = -1;
goto ERROR;
}
if(state1 == 2 && switch2)
{
errorCode = 2;
goto ERROR;
}
printf("No error!");
return;
ERROR:
printf("%d", errorCode);
}
这是我能想到的最短、最简洁的方法,但它一直被认为使用goto 是一件坏事。有没有更好的方法来解决这个问题,或者在稳定性和维护方面这是最好的方法吗?
【问题讨论】:
-
Gotos 完全可以用于实现状态机(为了掩护而躲避和奔跑)。但是你的代码是状态变量和 goto 的混合体,我不喜欢这样。
-
您不仅在这里滥用
goto,而且您所做的只是制造了一个简陋的异常版本。定义您自己的异常类,其中包括您的errorCode值和throw。 -
@EdHeal 我重新标记了这个问题,因为代码不是 C++
-
“使用 goto 是一件坏事”是一个可悲的普遍的过度概括。 C 中总是有替代方案,尤其是在 C++ 中。 通常有更好的选择,尤其是在 C++ 中。然而,在“通常”和“总是”之间的差距中,在某些情况下,谨慎、战略性地使用
goto是最干净、最清晰的替代方案。拒绝可用的最干净、最清晰的代码,因为教条主义认为goto是坏的、坏的、坏的!不是一个理性的决定。