0

以下两个 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;
    }
}
4

8 回答 8

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

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

于 2009-01-30T16:43:25.033 回答
3

另一种选择:

switch (myValue)
{
    case 1:
    {
        methodFor1();
        break;
    }
    case 2:
    {
        methodFor2or3();
        methodFor2();
        break;
    }
    case 3:
    {
        methodFor2or3();
        methodFor3();
        break;
    }
}
于 2009-01-30T16:42:06.753 回答
2

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

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


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

希望这可以帮助!

于 2009-01-30T16:45:48.197 回答
1

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

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

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

然后拨打methodFor2methodFor3每次通话methodFor2or3

于 2009-01-30T18:28:22.357 回答
0

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

于 2009-01-30T16:45:16.060 回答
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();
于 2009-01-30T16:48:39.110 回答
0

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

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

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

保罗。

于 2009-01-30T17:10:35.040 回答
0

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

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

于 2009-01-30T17:12:39.000 回答