簡體   English   中英

開關盒的替代品

[英]alternatives to switch-case

我想知道這種切換用例是否合適,還是有其他替代方案(模式)?

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

基礎是我正在做一系列的行動

  1. 程序控制一般是按照案例的順序逐個進行;

  2. 通常任何特定的情況都沒有在第一次調用中完成,我們必須等到procX return 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++;
        }

您可以使用Dictionary<int,Func<bool>> ,這樣您將具有更少的圈復雜度,請參閱示例:

注意:我使用Dictionary來表明您可以使用任何類型作為鍵,例如帶有名稱的stringenum

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

我認為這是使用責任鏈設計模式的絕佳機會。

以下是我發現的更好的描述之一: https//sourcemaking.com/design_patterns/chain_of_responsibility也是實施示例: http//www.tutorialspoint.com/design_pattern/chain_of_responsibility_pattern.htm

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM