Code Complete II《軟體建構之道 2》#15 讀書心得與整理

第十五章 使用條列式
Using Conditionals

15.1 if陳述式
if Statements


簡單if-then陳述式(if & if-else)
Plain if-then Statements

if (Expression)
{
    //Statement
}
else
{
    //Statement
}
    先寫一般路徑的程式,再寫非一般的情況
      if(運算式)
          一般路徑
      else
          非一般路徑
    慎用等號
    1. 用'>'取代'>='
    2. 用'<'取代'<='
    3. 用'>'和'<'的範圍取代'=='
      比較不會出現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和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

  1. 依字母或數字順序(A~Z, 0~9)
  2. 先置入正常,再置入例外(正常~例外)
  3. 先置入常見,再置入不常見(常見~不常見)

使用case陳述式的秘訣
Tips for Using case Statements

    簡化每個案例動作
    1. 簡短程式碼
    2. 呼叫常式
    不要為了使用case而刻意創造「特殊的判斷方式」(phony variables)
      判斷無法快速擴充,當要擴充時必須重新寫整段,並且測試。等於重新設計整段程式碼。
    只使用default案例偵測唯一案例
      正確的使用default的話,新增案例,只是小事一樁
      不正確的使用default的話,要把default案例裡的code移走之類的...
    使用default偵測錯誤
      default的用法: 將「根本不該發生」的情況放在default,在除錯時,這一個方式非常有用。
      不使用default偵測錯誤,隱喻了每一個案例都是正確的。請務必檢查輸入的值是否正確。
    在C++和Java中避免case程式碼最後接著下一個case
      程式會繼續往下一個案例執行,直到最後一個案例或者遇到break;或return
      使用break; 或者 return xxx;來做case的結尾
    在C++中,case程式允許緊接著下一個caes預必加註解
      如果,在你的設計,就是要讓這個案例執行完,接著下一個案例執行,或者這兩個案例有共同的程式段,必須這麼做。請加註解說明,以免接手的程式設計師以為這是你犯的錯誤。

沒有留言:

張貼留言

(什麼是留言欄訊息?)