2016-01-09 66 views
0

我想知道如果这种开关的情况下使用的是合适的,或者有其他替代产品(模式)?替代的switch-case

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

基本是我做的一个动作序列

  1. 一般程序控制是以下情况逐一顺序;

  2. 通常情况下,任何特定的情况下,其第一个电话没有完成,我们必须等到procX return s 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++; 
     } 
+0

你可以使用状态模式。每个过程都在每个状态中使用。您可以更改为下一个状态 – ntohl

+0

您可以创建一个字典,其中数字为键,函数委托为值。这会使代码变小一些。 – etalon11

+0

创建函数功能的数组中此类似行动:http://stackoverflow.com/questions/23477823/is-it-possible-to-store-lambda-expression-in-array-c-sharp –

回答

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](); 
+0

o.o,我也会这样做,kkkkk –

5

您可以使用Dictionary<int,Func<bool>>,有了这个,你将有较少的圈复杂度,看到的例子:

注:我使用字典表明你可以使用任何类型的关键,例如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++; 
    } 
+0

这看起来不错。 – Chengting

+0

这看起来不错。 – Chengting

+1

这看起来很好。不可避免的是,当有一天插入新的proc时,例如在proc0和proc1之间,我必须更新对前一个proc1的引用,它现在是proc2。 - 这种头痛可能是不可避免的。 – Chengting