c - Switch Case 中的 Switch Case - 是否使用跌落式机箱,然后使用相同跌落式的新 Switch Case,这是一种糟糕的设计理念?
问题描述
我正在设计一个系统,其中一些不同的状态将具有相同的初始操作,但是根据初始状态是什么,下一个状态会有所不同。
我正在考虑使用 switch case fallthrough,然后使用另一个 switch case 来确定最终状态,如下所示:
switch (State)
{
case State1:
case State2:
case State3:
//Same actions for all 3 states
UART_Transmit(&WakeUp);
UART_Receive(&WakeUpResponse);
if (WakeUpResponse != WAKEUP_RESPONSE)
{
//We retry the ACk -> Ack Response
UART_Transmit(&WakeUp);
UART_Receive(&WakeUpResponse);
if (WakeUpResponse != WAKEUP_RESPONSE)
{
UART.State = NewState1;
}
}
//at this point, if WakeUpResponse == WAKEUP_RESPONSE
//then depending on the initial state, a new state is selected
if (WakeUpResponse == WAKEUP_RESPONSE)
{
//New switch case with the same States as above
switch(State)
{
case State1:
UART.State = NewState2;
break;
case State2:
UART.State = NewState3;
break;
case State3:
UART.State = NewState4;
break;
default:
break;
}
State4:
//Actions
break;
//other cases
}
这是解决这种情况的坏方法吗?我知道严格编码是可行的,但我正在寻找有关代码可维护性或任何其他可能出现这种情况的怪癖的输入。
感谢您的帮助。
解决方案
您可以将其重写为:
static void StateHelper(SomeType NewState)
{
UART_Transmit(&WakeUp);
UART_Receive(&WakeUpResponse);
if (WakeUpResponse != WAKEUP_RESPONSE)
{
//We retry the ACk -> Ack Response
UART_Transmit(&WakeUp);
UART_Receive(&WakeUpResponse);
if (WakeUpResponse != WAKEUP_RESPONSE)
{
UART.State = NewState1;
}
}
//at this point, if WakeUpResponse == WAKEUP_RESPONSE
//then depending on the initial state, a new state is selected
if (WakeUpResponse == WAKEUP_RESPONSE)
UART.State = NewState;
}
…
switch (State)
{
case State1:
StateHelper(NewState2);
break;
case State2:
StateHelper(NewState3);
break;
case State3:
StateHelper(NewState4);
break;
case State4:
//Actions
break;
//other cases
}
此外,如果状态值很小或连续或几乎如此,则可能需要创建一个数组NewStateLookup
,以便可以将其编写为:
switch (State)
{
case State1:
case State2:
case State3:
StateHelper(NewStateLookup[State]);
break;
case State4:
//Actions
break;
//other cases
}
推荐阅读
- angular - npm-cli.js" 前缀 -g' 未被识别为内部或外部命令
- date - Vue datepicker 将值更改为字符串
- c++ - 将已排序数组的元素分成最少数量的组,使得新数组的元素之间的差异小于或等于 1
- amazon-web-services - 允许下载到特定 IP 地址的 S3 访问策略
- python - 如何在旧数组成员之间插入空白或无
- java - 从 JList 中删除所有选定的元素?
- python - 以每月频率重新采样,左侧标签(月初)
- javascript - 单击并循环在多个 (5-7) 图像之间切换
- reactjs - Can/Should State 包含其值为 Function 的属性
- c# - 将文本放在所有 Excel 工作表的标题中(循环:foreach、for) - 低性能(C#)