ang*_*son 22
好吧,不是直接回答你的问题,因为你特别询问转换/案例陈述,但这是一个类似的问题.
这里讨论了使用guard-statements替换嵌套的if,它们会提前返回,而不是在确定返回值之前逐步检查越来越多的东西.
pax*_*blo 11
我总是尝试做的一个例子是更换嵌套如果是这样的(实际上这个并不太糟糕,但我已经看到它们在野外深达8或9级):
if (i == 1) {
// action 1
} else {
if (i == 2) {
// action 2
} else {
if (i == 3) {
// action 3
} else {
// action 4
}
}
}
Run Code Online (Sandbox Code Playgroud)
有了这个:
switch (i) {
case 1:
// action 1
break;
case 2:
// action 2
break;
case 3:
// action 3
break;
default:
// action 4
break;
}
Run Code Online (Sandbox Code Playgroud)
我还尝试保持尽可能小的动作(函数调用最适合这个)来保持switch语句的压缩(所以你不必提前四页看到它的结尾).
我认为,决策表只是设置标志,指示以后必须采取的行动."稍后"部分是基于这些标志的动作的简单排序.我可能是错的(这不会是第一次或最后一次:-).
一个例子是(标志设置阶段可能很复杂,因为它的动作非常简单):
switch (i) {
case 1:
outmsg = "no paper";
genmsg = true;
mailmsg = true;
phonemsg = false;
break;
case 2:
outmsg = "no ink";
genmsg = true;
mailmsg = true;
phonemsg = false;
break;
default:
outmsg = "unknown problem";
genmsg = true;
mailmsg = true;
phonemsg = true;
break;
}
if (genmsg)
// Send message to screen.
if (mailmsg)
// Send message to operators email address.
if (phonemsg)
// Hassle operators mobile phone.
Run Code Online (Sandbox Code Playgroud)
小智 9
链式ifs怎么样?
更换
if (condition1)
{
do1
}
else
{
if (condition2)
{
do2
}
else (condition3)
{
do3;
}
}
Run Code Online (Sandbox Code Playgroud)
同
if (condition1) {
do1;
} else if (condition2) {
do2;
} else if (condition3) {
do3;
}
Run Code Online (Sandbox Code Playgroud)
这很像复杂条件的switch语句.
小智 6
将条件设置为布尔值,然后为每个案例编写布尔表达式.
如果代码是:
if (condition1)
{
do1
}
else
{
if (condition2)
{
do2
}
else (condition3)
{
do3;
}
}
Run Code Online (Sandbox Code Playgroud)
人们可以把它写成:
bool cond1=condition1;
bool cond2=condition2;
bool cond3=condition3;
if (cond1) {do1;}
if (!cond1 and cond2) {do2;}
if (!cond1 and cond3) {do2;}
Run Code Online (Sandbox Code Playgroud)