Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 替换嵌套的if语句_Algorithm_Design Patterns_Nested - Fatal编程技术网

Algorithm 替换嵌套的if语句

Algorithm 替换嵌套的if语句,algorithm,design-patterns,nested,Algorithm,Design Patterns,Nested,这与中的一章有关。 在那一章中,我读到了嵌套的ifs 作者谈到了嵌套较深的ifs是bug的始作俑者,可读性较差。 他正在谈论用case语句和替换嵌套的ifs 有人能举例说明如何删除嵌套的ifs和case(select case)以及决策表吗 好吧,由于您专门询问了switch/case语句,所以不是直接回答您的问题,但这里有一个类似的问题 这涉及到用提前返回的保护语句替换嵌套的if,而不是在确定返回值之前逐步检查越来越多的内容。我一直尝试的一个例子是替换嵌套严重的if(事实上,这一个不算太差,

这与中的一章有关。 在那一章中,我读到了嵌套的
if
s

作者谈到了嵌套较深的
if
s是bug的始作俑者,可读性较差。 他正在谈论用
case
语句和替换嵌套的
if
s


有人能举例说明如何删除嵌套的
if
s和
case
select case
)以及决策表吗

好吧,由于您专门询问了switch/case语句,所以不是直接回答您的问题,但这里有一个类似的问题


这涉及到用提前返回的保护语句替换嵌套的if,而不是在确定返回值之前逐步检查越来越多的内容。

我一直尝试的一个例子是替换嵌套严重的if(事实上,这一个不算太差,但我在野外看到了高达8或9层的它们):

为此:

switch (i) {
    case 1:
        // action 1
        break;
    case 2:
        // action 2
        break;
    case 3:
        // action 3
        break;
    default:
        // action 4
        break;
}
我还尝试将操作保持尽可能小(函数调用是最好的方法),以保持switch语句的压缩(因此您不必提前四页看到它的结尾)

我相信决策表只是设置标志,指示以后必须采取的行动。“以后”部分是基于这些标志的简单行动顺序。我可能错了(这不是第一次或最后一次:-)

一个例子是(标志设置阶段可能会很复杂,因为其操作非常简单):


将条件转换为布尔值,然后为每种情况编写布尔表达式

如果代码为:

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;}

一些语言允许的另一个例子是

           switch true{
            case i==0
              //action
            break

            case j==2
             //action
            break

            case i>j
             //action
            break
           }
连锁的如果呢

替换

if (condition1)
{
    do1
}   
else
{
    if (condition2)
    {
        do2
    }
    else (condition3)
    {
        do3;

    }
}


这很像复杂条件下的switch语句。

有关决策表,请参阅我的答案,或者更好地阅读中的第18章。

如果和switch语句不是纯粹的OO。它们是有条件的过程逻辑,但是做得很好!如果您想为了更OO的方法而删除这些语句,您可能需要o考虑使用.

决策表,在这里你强>将条件逻辑存储在数据结构中,而不是在代码本身< /强> < /p>中。 因此,与此相反(使用@Pax的示例):

你可以这样做:

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();
void action1()
{
//行动1
}
无效行动2()
{
//行动2
}
无效行动3()
{
//行动3
}
无效行动4()
{
//行动4
}
#定义NUM_操作4
//为i的每个允许值创建函数指针数组
void(*actions[NUM_actions])()={NULL,action1,action2,action3}
//现在在函数体的某个地方。。。
如果((i
如果
i
的可能性不是低位整数,则可以创建查找表,而不是直接访问
actions
数组的
i
th元素


当您对几十个可能的值进行决策时,这种技术比嵌套的
if
s或
switch
语句更有用。

嵌套的if与逻辑运算符和

if (condition1)
{
    if (function(2))
    {
        if (condition3)
        {
            // do something
        }
    }
}
等效代码:

if (condition1 && function(2) && condition3)
{
    // do something
}

在这两种情况下,当表达式的计算结果为false时,将不会计算后续表达式。例如,如果condition1为false,则不会调用函数(),并且不会计算condition3。

例如,如果验证的一部分失败,则可以中断验证

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;
}

因为“else-if”是邪恶的,必须写为“else{if…}”?但是对于像这样的简单if使用开关是正确的好像这是一件坏事!这就像Sooooo 1986。你应该告诉人们,他们的代码这些天功能不够。哈哈,我最近碰巧读了这篇文章,并认为直接响应可能是合适的。当有很多条件时,这会变得非常难看。另外,可读性会丧失,因为实际条件是h“我在布尔值后面打了个比方。@DanielBecroft我实际上是反其道而行之。我同意,为了做到这一点,你给布尔变量起了一个有意义的名字,这将提高可读性……尽管如此,这里介绍的方法并不是一个灵丹妙药。如果你不想不必要地计算条件呢?同意w对于@Mazyod,上面的缺点是条件得到了不必要的计算。在Scala中,一个懒惰的val有帮助。它是不等价的:)因为
函数(2)
条件1
为false时不会运行,在第二个示例中,所有3个函数都会运行,这会影响性能。不,@PHPLover-PHP使用懒惰求值(有时称为短路评估),因此,如果逻辑AND中的第一个条件为false,它将不会尝试计算任何其他条件。同样,如果您正在执行OR,并且第一个条件为true,它将不会计算第二个条件。它们仍然不等价,我刚刚测试过,如果第二个参数有错误,将显示一个错误,这意味着if语句仍然运行所有参数。@PHPLover我无法想象您测试的是哪种代码以及您是如何执行测试的。惰性求值是所有主要编程语言共有的一个古老的、众所周知的特性,程序员在编写代码时必须考虑到这一点。您可以在嵌套IF和逻辑and运算符上联机尝试PHP代码ion的行为也一样。你能提供你的代码片段来证明相反吗?我不确定我是否喜欢这里的多重返回。改为转到错误退出?
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();
if (condition1)
{
    if (function(2))
    {
        if (condition3)
        {
            // do something
        }
    }
}
if (condition1 && function(2) && condition3)
{
    // do something
}
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;
}