我已经编写了一个状态流处理程序,为减少在状态流处理程序之外使用状态流枚举的风险,我在函数块中定义了状态流枚举。
我的代码如下:
static void RequestHandler(bool isThisRequestANewRequest)
{
typedef enum
{
STATE_NEW_REQUEST,
STATE_1,
STATE_2,
STATE_ERROR,
} States;
static States state = STATE_ERROR;
if(isThisRequestANewRequest == true)
{
state = STATE_NEW_REQUEST;
}
switch(state)
{
case STATE_NEW_REQUEST:
//init request flags
state = STATE_1;
//lint -fallthrough
case STATE_1:
//do something
break;
case STATE_2:
//do something else
break;
case STATE_ERROR:
default:
//do something in case of error
break;
}
}
这可以算是一种好习惯吗?有没有风险?有什么缺点吗?(维护,阅读,...)
我的一位同事告诉我这不是,但我正在等待基于事实的答案,而不仅仅是原始意见。
注意:我的问题适用于单线程和多线程任务。
通常,尽可能缩小范围是一种好习惯。如果要对此进行某种形式的规范引用,我能想到的最接近的是MISRA-C:2012,规则8.9,建议仅在块范围内声明仅由单个函数使用的对象。我不明白为什么同样的不适用于类型。
但是,在switch语句中依靠掉线是不好的做法,因为这会阻止静态分析器(在这种情况下为Lint)查找由missing引起的实际错误break
。这也使代码更难阅读和维护-我个人认为直通式转换的实践比代码重复性差得多。
如果要在每个函数调用中执行多个状态,请考虑使用简单的if
语句:
if(state == STATE_NEW_REQUEST)
{
...
state = STATE_1;
}
if(state == STATE_1)
{
...
}
否则,如果每个函数调用仅执行一个状态,则可以使用switch
。通常,“每个状态执行几个状态”的需求暗示着可以改进更广泛的程序设计。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句