第十九章 通常控制问题php
1.布尔表达式编程
A:布尔表达式:编程语言
(1)用true和false做布尔判断,不要使用1和0函数
(2)隐式地比较布尔值与true和false,例如:spa
while(not done)code
{orm
do sth.....input
}it
而不要写成:io
while((not done)== true)
{
do sth.....
}
B:简化复杂的表达式:
(1)拆分复杂的判断并引入新的布尔变量,把复杂的表达式作成布尔函数。
例如:
if((correctName() && correctPsw() && correctRole && TransformOK() )) { process log in....... }
能够简化为:
function checkUser()//封装为一个布尔函数 { if(correctName() && correctPsw()) { if(!correctRole()) { return false; } return true; } else { return false; } } //只关心我须要关心的部分 if((checkUser() && TransformOK())) { process log in....... }
C:编写确定形式的布尔表达式
(1)在if语句中,把判断条件从否认形式转化为确定形式,而且互换if和else子句中的代码。
if(!statusOK) { //do sth } else { //do sth else } 改成: if(statusOK) { //do sth else } else { //do sth }
(2)用狄摩根定理简化否认的布尔表达式(狄摩根定理)
例如:if(!displayOK || !printerOK) <===> if(!(displayOK&&printOK))
D:理解布尔表达式如何求值
不一样的编程语言对布尔表达式的求值方法不一样,有的编程语言采用“短路”求值,而有的编程语言会分别计算布尔表达式中每一项的值而后再计算组合后的值。
不该当依赖于特定语言对布尔表达式的求值方法,而应该尽量编写实践良好的代码,例如:(伪代码)
很差的实践:
while(i<MAX_ELEMENT and item[i] !=0 )
这段代码的问题是,若是所使用的语言不是短路求值,那么当i=MAX_ELEMENT的时候,循环体内部代码不执行,而循环判断条件,item[i] <==>item[MAX_ELEMENT],程序就会报错,由于下标越界,所以,应当改成以下:
while(i<MAX_ELEMENT) { if(item[i] != 0) { do sth; } }
2.深层嵌套处理
嵌套过深的if代码使代码阅读者难以理解,所以应当避免使用超过3到4层的代码嵌套。
(1)经过重复检测条件中的某一部分来简化嵌套的if语句。
例如:
糟糕的实践: if($inputStatus == Input_Success) { do sth if($printRoutine != NULL) { do sth if(SetUpPage()) { do sth 。。。 } } }
应当改成:
if($inputStatus == Input_Success) { do sth; if($printRoutine != NULL) 通常控制问题 { do sth; } }
//重复条件判断 if( ($inputStatus == Input_Success) && ($printRoutine != NULL) && (SetUpPage()) ) { if(。。。。) { 。。。 } }
(2)把嵌套的if转换成一组if-then-else语句(避免决策树中的冗余判断)
糟糕实践: if(10<quantity) { if(100<quantity) { if(1000<quantity) { discount = 0.10; } else { discount = 0.05; } } else { discount = 0.025; } } else { discount = 0.0; }
这段代码让人很难理解决策的逻辑是怎样的,在不改变决策树逻辑的状况下,代码应当被更好的组织:
if(1000 < quantity)
{
discount = 0.10;
}
else if((100 < quantity) && (quantity < 1000))
{
discount = 0.05;
}
else if((10 < quantity) && (quantity < 100))
{
discount = 0.025;
}
else if(quantity <= 10)
{
discount = 0.0;
}
(3)将深层嵌套中的某些部分抽取成子程序或方法。