Switch Case 中的 Switch Case - 使用 fall through cases 后跟一个新的 switch case 是否是一种糟糕的设计理念?
Switch Case within a Switch Case - Is using fall through cases followed by a new switch case of the same fall through a bad design philosophy?
我正在设计一个系统,其中一些不同的状态将具有相同的初始操作,但是根据初始状态的不同,下一个状态将有所不同。
我正在考虑使用 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
}
我正在设计一个系统,其中一些不同的状态将具有相同的初始操作,但是根据初始状态的不同,下一个状态将有所不同。
我正在考虑使用 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
}