将switch语句转换为while循环还是将while循环转换为case块?

3
我正在重构我写的一些代码,我必须决定是将一个switch语句放入while循环中,还是在每个case块中重复while循环。这两种不同的方式类似于以下伪代码:
选项1)
while (cnt > 0) {
    switch (value) {
    case A:
        doSomething();
        break;
    case B:
        doSomethingElse();
        break;
    ...
    default:
        default();
        break;
    }
    cnt--;
}

选项2)
switch (value) {
case A:
     while( cnt > 0){
        doSomething();
        cnt--;
      }
case B:
     while( cnt > 0){
        doSomethingElse();
        cnt--;
      }
...
default: 
     while( cnt > 0){
        default();
        cnt--;
      }
}

我认为第一个选项更符合DRY原则,因为我不需要每次重复while和cnt--。虽然我更喜欢第二个选项,因为它一旦在switch语句中选定一个情况,就开始在while循环中循环,而不必再评估switch条件。

那么,你会选择这两种解决方案中的哪一种,为什么?
注:我们可以假设switch条件(即代码中的变量"value")在整个while循环中没有改变,换句话说:操作doSomething(),doSomethingElse()等不会影响switch语句。
注2:在我正在处理的实际代码中,while循环可能非常巨大。对于某些测试用例,"Cnt"可以达到10^9的数量级。
3个回答

4
在大多数情况下,循环开关序列是一种反模式,出于清晰起见应该避免使用,而且由于你提到cnt可能会变得非常巨大,也出于性能考虑应该避免使用。

1
这根本不是循环 - 开关“反模式”的示例,因为循环值并没有驱动开关。 - little_birdie

4
如果cnt仅用于控制调用doSomething()等方法的次数,则应考虑将其传递到方法中并在方法内部循环。通常我会说不要担心性能,但如果你实际上要处理10^9次迭代,你应该避免重复使用switch。

2

选项2更加直接,因为你把重点放在switch语句上,在每次迭代中都要经过一个case可能会消耗更多的时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接