以下两个开关/案例陈述的更好做法是什么?
有更简单的方法(更少的代码)吗?
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;
}
}
答案 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;
}
}
然后调用methodFor2
和methodFor3
每次调用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更好地服务,请使用它。