第十五章 使用條列式
Using Conditionals
15.1 if陳述式
if Statements
簡單if-then陳述式(if & if-else)
Plain if-then Statements
if (Expression)
{
//Statement
}
else
{
//Statement
}
-
先寫一般路徑的程式,再寫非一般的情況
if(運算式)
一般路徑
else
非一般路徑
慎用等號- 用'>'取代'>='
- 用'<'取代'<='
- 用'>'和'<'的範圍取代'=='
- 比較不會出現Off by one的錯誤
if(b == B)
改成
if(b > A && b < c)
比較好
正常的情況放在if這一句,而不是else這一句if(判斷A){
例外A----------------x
}else{
正常A----------------o
if (判斷B){
正常B------------o
if (判斷C){
例外C--------x
else
正常C--------o
}else
例外B------------x
}
改成下面這樣比較好
if(判斷A){
正常A----------------o
if (判斷B){
正常B------------o
if (判斷C){
正常C--------o
else
例外C--------x
}else
例外B------------x
}else{
例外A----------------x
}
有意義的陳述式放在if後面if(someTest)
;
else
doSomething();
不如這樣寫來得好
if(!someTest)
doSomething();
寫if陳述式時,一併思考else陳述式- Sample code
if(!someTest)
doSomething();
else
//else doSomethingElse() is out of define
//You can add assert(0) or not
測試else的邏輯正確性- 如果可以測試else務必測試
- 小心搞反了if的邏輯
連續if-then-else陳述式(if-else if)
Chains of if-then-else Statement
if (Expression)
{
//Statement
}
else if (Expression)
{
//Statement
}
else
{
//Statement
}
- 用回傳布林值的函數或運算式簡化複雜測試
- 增加可讀性
//C++ Example of an if-then-else Chain That Uses Boolan function Calls
if ( IsControl( input Character ) ) {
characterType = Chatactertype_ControlCharacter;
}else if ( IsPunctuation ( inputCharacter ) ) {
characterType = ChatacterType_Punctuation;
}else if ( IsDigit ( inputCharacter ) ) {
characterType = ChatacterType_Digit;
}else if ( IsLetter ( inputCharacter ) ) {
characterType = ChatacterType_Letter;
}
把最常見案例放在前面- 增加可讀性,減少判斷的次數,提高效率
if ( ... ) {
//最常見
}else if ( ... ) {
//次常見
}else if ( ... ) {
//不常見
}
確定已包含所有案例
- else用來產生不應該發生的錯誤訊息
//一個只有三種情況的範例,其它情況為「不該發生的情況」
if ( 是否為情況一 ) {
//情況一
}else if ( 是否為情況二 ) {
//情況二
}else if ( 是否為情況三 ) {
//情況三
}else{
//不該發生的情況
//用assert(0) hight-light
}
如果你的語言支援,把if-else改成其它的語法- 優點:更好撰寫、提昇可讀性
15.2 case陳述式
case Statement
switch (Expression)
{
case 1:
//Statement
break;
case 2:
//Statement
break;
default:
//Statement
}
選擇有效的case排序
Choosing the Most Effective Order of Case
- 依字母或數字順序(A~Z, 0~9)
- 先置入正常,再置入例外(正常~例外)
- 先置入常見,再置入不常見(常見~不常見)
使用case陳述式的秘訣
Tips for Using case Statements
-
簡化每個案例動作
- 簡短程式碼
- 呼叫常式
- 判斷無法快速擴充,當要擴充時必須重新寫整段,並且測試。等於重新設計整段程式碼。
- 正確的使用default的話,新增案例,只是小事一樁
不正確的使用default的話,要把default案例裡的code移走之類的...
- default的用法:
將「根本不該發生」的情況放在default,在除錯時,這一個方式非常有用。
- 不使用default偵測錯誤,隱喻了每一個案例都是正確的。請務必檢查輸入的值是否正確。
- 程式會繼續往下一個案例執行,直到最後一個案例或者遇到break;或return
使用break; 或者 return xxx;來做case的結尾
- 如果,在你的設計,就是要讓這個案例執行完,接著下一個案例執行,或者這兩個案例有共同的程式段,必須這麼做。請加註解說明,以免接手的程式設計師以為這是你犯的錯誤。
沒有留言:
張貼留言
(什麼是留言欄訊息?)