2016-01-09 65 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