我想知道这种切换用例是否合适,还是有其他替代方案(模式)?
以下是我的计划的一部分:
基础是我正在做一系列行动
一般来说,程序控制是按照案例的顺序逐一进行的;
通常任何特定情况都没有在第一次调用中完成,我们必须等到procX return
s 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++;
}
答案 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