【问题标题】:Switch statement into while loop or while loop into case blocks?将语句切换到while循环或while循环到case块?
【发布时间】:2013-04-07 09:13:04
【问题描述】:

我正在重构我编写的一些代码,我必须决定是要将 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 原则,因为我不会每次都重复 while 和 cnt--。虽然我更喜欢第二个选项,因为一旦它在 switch 语句中选择了一个 case,它就会在 while 中开始循环,并且不再需要评估 switch 条件。

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

注意:我们可以假设 switch 条件(即下面代码中的变量“值”)在整个 while 循环中都不会改变,换句话说:操作 doSomething()、doSomethingElse() 等。不影响 switch 语句。

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

【问题讨论】:

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


    【解决方案1】:

    在大多数情况下,Loop-switch sequence 是一种反模式,为了清楚起见,您应该避免使用,并且因为您提到 cnt 也可能为了性能而变得非常大。

    【讨论】:

    • 这根本不是循环开关“反模式”的示例,因为循环值不驱动开关。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      选项 2 更直接,因为您将重点放在 switch 语句上,并且必须在每次迭代中处理 case 可能会花费更多时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-28
        • 2020-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-19
        • 1970-01-01
        相关资源
        最近更新 更多