[英]alternatives to switch-case
我想知道這種切換用例是否合適,還是有其他替代方案(模式)?
以下是我的計划的一部分:
基礎是我正在做一系列的行動
程序控制一般是按照案例的順序逐個進行;
通常任何特定的情況都沒有在第一次調用中完成,我們必須等到procX return
true
。 (等待文書回應或行動完成);
可以跳轉到特定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來表明您可以使用任何類型作為鍵,例如帶有名稱的
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++;
}
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.