首页 > 解决方案 > 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
}

这是解决这种情况的坏方法吗?我知道严格编码是可行的,但我正在寻找有关代码可维护性或任何其他可能出现这种情况的怪癖的输入。

感谢您的帮助。

标签: cembedded

解决方案


您可以将其重写为:

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
}

推荐阅读