开关盒的替代品

时间:2016-01-09 22:09:30

标签: c# switch-statement controls sequence

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

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

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

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

  2. 通常任何特定情况都没有在第一次调用中完成,我们必须等到procX return s true。 (等待仪器响应或行动完成);

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

  4. 我发现这种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++;
            }
    

3 个答案:

答案 0 :(得分:6)

您可以使用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},
}

而不是那样使用:

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

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

        if( bRetSts )
            StepCurrent++;
    }

答案 1 :(得分:1)

bRetSts = (StepCurrent == 0)? proc0():
          (StepCurrent == 1)? proc1():
          (StepCurrent == 2)? proc2():
          (StepCurrent == 3)? proc3():
          false; // it could be more proper to throw an exception

或者,如果所有procX具有相同的签名,则可能更合适:

var funcs = new Func<bool>[] { proc0, proc1, proc2, proc3 };
funcs[StepCurrent]();

答案 2 :(得分:0)

我认为这是使用责任链设计模式的绝佳机会。

以下是我发现的更好的描述之一:https://sourcemaking.com/design_patterns/chain_of_responsibility此外,还有一些实施示例:http://www.tutorialspoint.com/design_pattern/chain_of_responsibility_pattern.htm