我知道使用goto语句并不常见。但是,我不知道是否有必要在这里将其替换为其他东西。
此伪代码是一种状态机,取决于某些条件,我需要能够“跳转”到特定点。只要通过串行通信接收到一点,就会调用此代码。
switch (Actual_state)
{
case "FirstState":
if(restriction)goto case "FourthState";
//state code
Actual_state = Next_state;
break;
case "SecondState":
//state code
Actual_state = Next_state;
break;
case "ThirdState":
//state code
Actual_state = Next_state;
break;
case "FourthState":
//state code
Actual_state = Next_state;
break;
case "FifthState":
//state code
goto case "SixthState"; //if the statement code is complete I need it to go directly to next state, else it would overwrite some info and I don't want more variables. make any suggestion you want.
break;
case "SixthState":
//state code
Actual_state = Next_state;
break;
case "LastState":
Actual_state = "FirtState";
break;
}
一切正常,但我希望对此工作流程发表一些意见。如果是垃圾,可以这样说。
答案 0 :(得分:4)
此代码需要重构。
状态机是一种常见的模式;如果您想使用该模式,那么我建议您实际上实现一个状态机类型。状态机的本质是什么?
interface IStateMachine<TIn, TOut, TState>
{
TOut Next(TIn input);
TState State { get; }
bool IsHalted { get; }
}
现在您可以实现通过实现此接口来实现状态机逻辑的基类abstract class StateMachine<TIn, TOut, TState>
吗?请特别注意如何表示转换函数。
现在您可以将逻辑实现为基本类型的派生类型吗?