使用嵌套switch / case语句的最佳/最简单方法是什么?

时间:2009-01-30 16:37:51

标签: actionscript-3 scripting conditional switch-statement

以下两个开关/案例陈述的更好做法是什么?

有更简单的方法(更少的代码)吗?

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;
    }
}

8 个答案:

答案 0 :(得分:8)

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

为什么所有的麻烦只是为了避免重复methodFor2or3() 一次

答案 1 :(得分:3)

还有一个选择:

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

答案 2 :(得分:2)

由于函数是actionscript3中的第一类对象,因此可以为函数构建值的散列,如下所示:

var myDict:Dictionary = new Dictionary(); 
myDict[1] = methodFor1; 
myDict[2] = methodFor2;


function handleStuff(myVal:Number):void{
    var myFunction:Function = myDict[myVal];
    myFunction();
}

希望这有帮助!

答案 3 :(得分:1)

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

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

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

然后调用methodFor2methodFor3每次调用methodFor2or3

答案 4 :(得分:0)

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

答案 5 :(得分:0)

更像是什么:

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();

答案 6 :(得分:0)

当您处理控制问题的编程流时,“少代码”并不是您想要优化的属性。将结构问题转化为简单易读的问题要好得多。

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

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

保罗。

答案 7 :(得分:0)

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

在我看来,你的块在交换机内的事实没有区别。如果交换机可以更好地服务逻辑,请使用交换机(嵌套或不嵌套)。如果if-else更好地服务,请使用它。