开关盒的替代品

Che*_*ing 2 c# controls sequence switch-statement

我想知道这种切换用例是否合适,还是有其他替代方案(模式)?

以下是我的计划的一部分:

基础是我正在做一系列的行动

  1. 程序控制一般是按照案例的顺序逐个进行;

  2. 通常任何特定情况都没有在第一次调用中完成,我们必须等到procX returns true.(等待文书回应或行动完成);

  3. 可以跳转到特定case的(StepCurrent在采样代码中更改).

我发现这种switch- case很难维护,特别是通过改变StepCurrent直接控制流程.代码看起来很难看.

有没有更好的方法?

注意:虽然我使用的是C#,但问题可能不仅限于此.

    while (true)
        {
            if (sig_IsExit())
            {
                break;
            }

            Thread.Sleep(500);

            bRetSts = false;
            switch (StepCurrent) // nSeq)
            {
                case 0:
                     bRetSts = proc0();
                     break;

                case 1:

                     bRetSts = proc1();
                    break;
                case 2:
                     bRetSts = proc2();
                    break;

                case 3:
                     bRetSts = proc3();
                    break;

                case 4:
                   ...
            }

            if( bRetSts )
                StepCurrent++;
        }
Run Code Online (Sandbox Code Playgroud)

Joe*_*zen 6

您可以使用a Dictionary<int,Func<bool>>,这样您的圈复杂度会更少,请参阅示例:

注意:我使用Dictionary来表明您可以使用任何类型作为键,例如string带有名称或类型的键enum.

Dictionary<int,Func<bool>> proc = new Dictionary<int,Func<bool>>
{
   {0, proc0},
   {1, proc1},
   {2, proc2},
   {3, proc3},
}
Run Code Online (Sandbox Code Playgroud)

而不是像那样使用:

  while (true)
    {
        if (sig_IsExit())
           break;
        Thread.Sleep(500);

        bRetSts = false;
        bRetSts = proc[StepCurrent]();

        if( bRetSts )
            StepCurrent++;
    }
Run Code Online (Sandbox Code Playgroud)