替换嵌套的if语句

Bis*_*ath 29 algorithm design-patterns nested

这与美丽代码中的一章有关.在那一章中我读到了嵌套ifs.

作者正在讨论深层嵌套if作为错误的创始人和不太可读的问题.他正在谈论ifcase语句和决策表替换嵌套的s .

任何人都可以说明如何if使用case(select case)和决策表删除嵌套的s ?

ang*_*son 22

好吧,不是直接回答你的问题,因为你特别询问转换/案例陈述,但这是一个类似的问题.

反转"if"语句以减少嵌套

这里讨论了使用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)

  • 因为“else if”是邪恶的,必须写成“else { if ... }”?但是您对像这样的简单 if 使用 switch 是正确的。 (2认同)

小智 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)

  • 当有很多条件时,这会变得非常难看。另外,由于实际条件隐藏在布尔值后面,因此会失去可读性。 (3认同)