将语句切换到while循环或while循环到case块?

时间:2013-04-07 09:13:05

标签: refactoring while-loop switch-statement code-readability

我正在重构我编写的一些代码,我必须决定是否要将switch语句放入while循环中,或者将while循环重复到每个case块中。两种不同的方式类似于以下伪代码:

选项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原则,因为我不会每次都重复这段时间和cnt--。虽然我喜欢第二个选项好一点,因为一旦它在switch语句中选择一个case,它就会在while中开始循环,而不必再评估switch条件了。

那么,您会选择这两种解决方案中的哪一种?为什么?

注意:我们可以假设switch循环条件(即下面代码中的变量“value”)对整个while循环没有变化,换句话说:操作doSomething(),doSomethingElse()等。不要影响switch语句。

NB2:在我正在处理的实际代码中,while循环可能非常庞大。对于一些测试用例,“Cnt”可以是10 ^ 9

的量级

3 个答案:

答案 0 :(得分:4)

在大多数情况下,Loop-switch sequence是一个反模式,为了清晰起见,你应该避免使用它,因为你提到cnt也会因性能而变得非常庞大。

答案 1 :(得分:3)

如果cnt仅用于控制调用doSomething()等的次数,则应考虑将其传递给方法并在方法内循环。通常我会说不要担心性能,但如果你真的在谈论10 ^ 9次迭代,你应该避免重复切换。

答案 2 :(得分:1)

选项2更直接,因为您强调switch - 语句,并且在每次迭代中必须通过case可能会消耗更多时间。