作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一个状态流处理程序,为了降低在状态流处理程序外部使用状态流枚举的风险,我在函数 block 内定义了状态流枚举。
我的代码如下:
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,它建议仅由单个函数使用的对象应在 block 范围内声明。我不明白为什么这不适用于类型。
然而,依赖 switch 语句中的 fall-through 是一种不好的做法,因为这会阻止静态分析器(如本例中的 Lint)发现因缺少 break
而导致的真正错误。它还使代码更难阅读和维护 - 我个人认为 fall-through switches 比代码重复更糟糕。
如果您要在每个函数调用中执行多个状态,请考虑使用简单的 if
语句:
if(state == STATE_NEW_REQUEST)
{
...
state = STATE_1;
}
if(state == STATE_1)
{
...
}
否则,如果每次函数调用只执行一个状态,则可以使用开关
。一般来说,“每个状态执行多个状态”的需要暗示可以改进更广泛的程序设计。
关于c - 为什么在函数 block 中定义枚举可能是一种不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56631640/
我是一名优秀的程序员,十分优秀!