好的,虽然你具体问的是关于switch/case语句的问题,但这里有一个类似的问题。
这里介绍了使用守护语句替换嵌套的if语句,它们会提前返回,而不是逐步检查更多内容,最后才选择返回值。
我总是尝试做一个例子,就是像这样替换掉嵌套的if语句(实际上这个例子并不太糟糕,但是我在真实场景中见过8或9层的嵌套):
if (i == 1) {
// action 1
} else {
if (i == 2) {
// action 2
} else {
if (i == 3) {
// action 3
} else {
// action 4
}
}
}
使用这个:
switch (i) {
case 1:
// action 1
break;
case 2:
// action 2
break;
case 3:
// action 3
break;
default:
// action 4
break;
}
我也尽量将操作保持尽可能小(函数调用最好),以便压缩 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.
if (condition1)
{
do1
}
else
{
if (condition2)
{
do2
}
else (condition3)
{
do3;
}
}
bool cond1=condition1;
bool cond2=condition2;
bool cond3=condition3;
if (cond1) {do1;}
if (!cond1 and cond2) {do2;}
if (!cond1 and cond3) {do2;}
如何处理连锁 if 语句?
替换为
if (condition1)
{
do1
}
else
{
if (condition2)
{
do2
}
else (condition3)
{
do3;
}
}
使用
if (condition1) {
do1;
} else if (condition2) {
do2;
} else if (condition3) {
do3;
}
function validate(){
if(b=="" || b==null){
alert("Please enter your city");
return false;
}
if(a=="" || a==null){
alert("Please enter your address");
return false;
}
return true;
}
决策表是将条件逻辑存储在数据结构中,而不是在代码本身中。
因此,不使用 @Pax 的示例:
if (i == 1) {
// action 1
} else {
if (i == 2) {
// action 2
} else {
if (i == 3) {
// action 3
} else {
// action 4
}
}
}
你可以像这样做:
void action1()
{
// action 1
}
void action2()
{
// action 2
}
void action3()
{
// action 3
}
void action4()
{
// action 4
}
#define NUM_ACTIONS 4
// Create array of function pointers for each allowed value of i
void (*actions[NUM_ACTIONS])() = { NULL, action1, action2, action3 }
// And now in the body of a function somewhere...
if ((i < NUM_ACTIONS) && actions[i])
actions[i]();
else
action4();
actions
数组的第i个元素。if
或switch
语句更有用。if和switch语句并不是纯粹的面向对象编程。它们是条件过程逻辑,但是它们做得非常好!如果你想要采用更加面向对象的方法来移除这些语句,可以结合“状态”和“描述符”模式。
嵌套的if语句相当于逻辑运算符AND
if (condition1)
{
if (function(2))
{
if (condition3)
{
// do something
}
}
}
等效的代码:
if (condition1 && function(2) && condition3)
{
// do something
}
condition1
为false,那么function(2)
不会运行。但是在第二个例子中,所有三个函数都会运行,这可能会影响性能。 - rossanmol