【问题标题】:What is the best/easiest way to use nested switch/case statements?使用嵌套 switch/case 语句的最佳/最简单方法是什么?
【发布时间】:2010-10-04 12:22:52
【问题描述】:

以下两个 switch/case 语句的更好做法是什么?

有没有更简单的方法(更少的代码)来做到这一点?

switch (myValue)
{
    case 1:
    {
        methodFor1();

        break;
    }
    case 2:
    case 3:
    {
        methodFor2or3();

        if (myValue == 2)
                methodFor2();

        if (myValue == 3)
                methodFor3();

        break;
    }
}

...or...

switch (myValue)
{
    case 1:
    {
        methodFor1();

        break;
    }
    case 2:
    case 3:
    {
        methodFor2or3();

        switch (myValue)
        {
            case 2:
            {
                methodFor2();

                break;
            }
            case 3:
            {
                methodFor3();

                break;
            }
        }

        break;
    }
}

【问题讨论】:

    标签: actionscript-3 scripting conditional switch-statement


    【解决方案1】:
    switch (myValue)
    {
      case 1:
        methodFor1();
        break;
      case 2:
        methodFor2or3();
        methodFor2();
        break;
      case 3:
        methodFor2or3();
        methodFor3();
        break;
    }
    

    为什么要避免重复methodFor2or3() 一次

    【讨论】:

    • 顺便说一句 - 多余的空行真的会损害可读性。
    • 注意,在给出的示例中,methodFor2or3 被称为 /before/methodFor2 或 methodFor3。但这一点是正确的。
    • @Adam Bellaire:你是对的。就个人而言,我不希望调用顺序成为单独功能的问题。我宁愿认为它是一种代码味道,并会完全重构它。
    • @Tomalak:这是一个非常危险的假设。如果 methodFor2or3() 是 prepareForProcessing() 而 methodFor2() 是 process2() 而 methodFor3() 是 process3() 呢??
    • 就个人而言,我很可能会在 method2 和 method3 的开头调用 methodFor2or3。
    【解决方案2】:

    另一种选择:

    switch (myValue)
    {
        case 1:
        {
            methodFor1();
            break;
        }
        case 2:
        {
            methodFor2or3();
            methodFor2();
            break;
        }
        case 3:
        {
            methodFor2or3();
            methodFor3();
            break;
        }
    }
    

    【讨论】:

      【解决方案3】:

      由于函数是 actionscript3 中的第一类对象,您可以为函数构建一个哈希值,如下所示:

      var myDict:Dictionary = new Dictionary(); 
      myDict[1] = methodFor1; 
      myDict[2] = methodFor2;
      
      
      function handleStuff(myVal:Number):void{
          var myFunction:Function = myDict[myVal];
          myFunction();
      }
      

      希望这会有所帮助!

      【讨论】:

        【解决方案4】:

        在我对switch 语句的编程中,我的目标是让每个案例最多有一行代码+break;。这是因为switch 会很快变得大而复杂,而我的大脑并不擅长复杂。

        所以,在你的情况下,我会写:

        switch (myValue)
        {
            case 1:
            {
                methodFor1();
                break;
            }
            case 2:
            {
                methodFor2();
                break;
            }
            case 3:
            {
                methodFor3();
                break;
            }
        }
        

        然后分别拨打methodFor2methodFor3 methodFor2or3

        【讨论】:

        • 在每个 case: 之后是 {} 必要的吗?
        • 不,但它们在原始问题中,所以我保留了样式。
        【解决方案5】:

        如果两种情况之间只有一条(相当简单的)行(如您的示例中的函数调用),那么我更喜欢将该行加倍以提高可读性。否则,这是一个品味问题。我更喜欢 case 语句中的 if 条件,因为这样你就不会混淆各个级别。

        【讨论】:

          【解决方案6】:

          来点类似的怎么样:

          var method:String = "methodFor" + String(value);
          this[method]();
          if (value == 3) methodFor2or3();
          

          如果您想要更简单的代码,您可能会考虑拆分 or3 调用:

          switch (value) {
              case 1: methodFor1(); break;
              case 2: methodFor2(); break;
              case 3: methodFor3(); break;
          }
          if (value == 2 || value == 3) methodFor2or3();
          

          【讨论】:

            【解决方案7】:

            当您处理控制问题的编程流程时,“更少的代码”并不是您真正想要优化的属性。解决结构性问题,让代码变得简单易读要好得多。

            因此,对于上述情况,第一个选项还不错,尽管很容易错过 2 的“流通”情况。更好的是只在 1 或 2 上进行父开关,然后在第二种情况下调用另一个处理子案例(正式为 2 和 3)的函数,并使其由不同的(子案例)变量驱动(到确保您没有重载初始“值”变量的“含义”。

            从哲学上讲,所有三种情况都是同一个开关的一部分,或者它们不是。如果是,那么他们应该被平等对待(并且彼此没有区别)。如果不是,那么它们应该由两个单独的变量驱动并在两个单独的函数中处理。试图通过组合它们来节省“带宽”会使事情变得不必要地复杂化。

            保罗。

            【讨论】:

            • 实际上,为了可读性,我更喜欢“更少的代码”。可读性对我来说非常重要,因为我厌倦了在我从事的每项工作中看到前任编写的垃圾代码。
            • “更少代码”的问题在于,作为一个目标,它最终会导致人们陷入混淆 C 竞赛(或 APL)之类的东西。如果你总是像为教科书做例子一样编程,结果会更好。
            • 我同意。 [less code] == [more readable] 参数扩展到一个可怕的地方,单行代码竞争和正则表达式统治着整个世界。
            【解决方案8】:

            我的回答是假设您知道您提供的示例案例是人为的并且以其他方式更好地编写。如果您只想知道最好是嵌套 switch 还是在 switch 中使用 if-else,这完全取决于品味和个人情况。

            在我看来,您的块在开关内这一事实没有什么区别。如果逻辑可以通过开关更好地服务,请使用开关(嵌套或不嵌套)。如果使用 if-else 会更好,请使用它。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-10-05
              • 1970-01-01
              • 2011-12-22
              • 2022-10-06
              • 1970-01-01
              相关资源
              最近更新 更多