第十九章 通常控制問題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)將深層嵌套中的某些部分抽取成子程序或方法。