顯示具有 Code Complete 2 標籤的文章。 顯示所有文章
顯示具有 Code Complete 2 標籤的文章。 顯示所有文章

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

沒有留言:

第十七章 不常見的流程控制程式結冓
Unusual Control Structures


17.1 常式的多重回傳
Multiple Returns from a Routine


在任何時候離開常式的方法。

return可以提高可讀性的時候
  1. 獲得解答,要立即回傳
  2. 不返回就得寫更多的程式碼跳過別的程式碼
使用防衛子句(guard clause)簡化複雜的錯誤處理
if (A is true)
    if (B is true)
        if (C is true)
            //...
不如改成
if (A isn't true)
    return notA;

if (B isn't true)
    return notB;

if (C isn't true)
    return notC;

//...everything is right

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

沒有留言:

第十六章 控制迴圈
Controlling Loops


16.1 選擇迴圈的種類
Selecting the Kind of Loop


第一種分類方式
  1. 計數迴圈
  2. 條件式迴圈
  3. 無窮迴圈
  4. 迭代迴圈
第二種分類方式
    A. 由彈性來區分
    1. 執行一定的次數---->使用for
    2. 檢查是否完成----->使用while並參考B分類
    B. 由檢迴圈完成與否的位置區分
    1. 開頭
    2. 中段
    3. 尾處
檢查處之前的程式碼,至少會執行一次。
檢查處之後的程式碼,不一定會執行。

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預必加註解
      如果,在你的設計,就是要讓這個案例執行完,接著下一個案例執行,或者這兩個案例有共同的程式段,必須這麼做。請加註解說明,以免接手的程式設計師以為這是你犯的錯誤。

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

沒有留言:

第十二章 主要資料型別
Fundamental Data Types


12.1 數字概述
Numbers in General

以下是使用數字較不易出錯的提醒:
  • 避免使用「magic number」
  • 必要時,可以hard code 0和1(本身有隱喻)
  • 遞增、遞減、迴圈初始值
  • 除法小心除0
  • 讓型別轉換更明顯
  • 避免混合型別比較
  • 注意編譯器warning

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

沒有留言:

第十一章 變數名稱的力量
The Power of Variable Names



11.1 選擇良好名稱的注意事項Considerations in Choosing Good Names

一個變量和一個變量的名字本質上是相同的東西
原文: a variable and a variable’s name are essentially the same thing
變數的一切,取決於變數名稱。
下列這個範例,是銀行要出信用卡帳單給客戶的程式碼。
請看看哪一個範例比較看得懂
//Java Example of Poor Variable Names
x = x - xx;
xxx = aretha + SalesTax( aretha );
x = x + LateFee( x1, x ) + xxx;
x = x + Interest( x1, x );
//Java Example of Good Variable Names
balance = balance - lastPayment;
monthlyTotal = NewPurchases + SalesTax( newPurchases );
balance = balance + LateFee( customerID, balance ) + monthlyTotal;
balance = balance + Interest( customerID, balance );

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

沒有留言:

第十章 使用變數的一般問題
General Issues in Using Variables



10.1 資料認知
Data Literacy


資料認知測試
The Data Literacy Test


熟悉1分,知道又不太確定0.5分,不知道沒聽過0分(依繁體中文版順序)

______ abstract data type ______ heap ______ retroactive synapse
______ array ______ index ______ referential integrity
______ bitmap ______ integer ______ stack
______ boolean variable ______ linked list ______ string
______ B-tree ______ named constant ______ structured variable
______ character variable ______ literal ______ tree
______ container class ______ local variable ______ typedef
______ double precision ______ lookup table ______ union
______ elongated stream ______ member data ______ value chain
______ enumerated type ______ pointer ______ variant
______ floating point ______ private ______ Total Score

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

沒有留言:

第九章 虛擬碼程式設計流程
The Pseudocode Programming Process

定義:
PPP(Pseudocode Programming Process)
虛擬碼程式設計流程

這一章節,在訴說著一個由思緒→文字→程式碼的過程,而著重於文字的階段。在設計的過程之中,總是有著許許多多的草稿,而PPP就是一種思緒草稿的實現。
副加價值在於程式碼的文件化,以及不另外花力氣就可以得到很棒的註解。

9.1 構築類別及常式
Summary of Steps in Building Classes and Routines

構築類別的步驟
Steps in Creating a Class

構築類別的大體設計
構築類別內的各常式
全面檢閱並測試類別

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

沒有留言:

第八章 防禦性程式設計
Defensive Programming

開車有防衛駕駛,寫程式有防禦性程式設計


8.1 保護程式在無效輸入資料的破壞
Protecting Your Program from Invalid Inputs


優秀的程式,無輪輸入什麼內容,都不會輸出垃圾。

a. 檢查所有來自外部的常式的參數
b. 檢查所有來自其它常式的常式的參數→8.5
c. 決定如何處理錯誤的輸入→5.3

最優秀的防禦性程式撰寫
  1. 重複的設計
  2. 程式碼前先寫虛擬碼
  3. 程式碼前先寫測試案例
  4. 進行低層級設計視察

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

沒有留言:

第七章 高品質常式
Hight-Quality Routines

常式(Routine):
定義:用於「單一目的」的個別方法,或是可以呼叫程序。
例如:C++的function、Java的Method 和 Microsoft Visual Basic的函式或子程序,C/C++的巨集。

什麼是「高品質」的常式?
先來看看什麼是非高品質的例子。
看到這,先找找下面的程式,有幾個問題,緊接著的就是解答囉!
//C++ Example of a Low-Quality Routine
viod HandlsStuff( CORP_DATA & inputRec, int crntQtr, EMP_DATA empRec, cougle & estimRevenue, double ytdRevenue, int screenX, int screenY, COLOR_TYPE & newColor, COLOR_TYPE & prevColor, StatusType & status, int expenseType)
{
 int i;
 for ( i = 0; i < 100; i++){
  inputRec.revenue[i] = 0;
  input Rec.expense[i] = corpExpense[ crntQtr ][i];
 }
 
 UpdateCorpDatabase ( empRec );
 estimRevenue = ytdRevenue * 4.0 / (double) crntQtr;
 newColor = prevColor;
 status = SUCCESS;

 if ( expenseType == 1){
  for( i = 0; i< 12; i++)
   profit[i] = revenue[i] - expense.type1[i];
 }
 else if ( expenseType == 2){
   profit[i] = revenue[i] - expense.type2[i];
 }
 else if ( expenseType == 3)
   profit[i] = revenue[i] - expense.type3[i];
 }

隱藏.cpp裡一切細節的範例程式

沒有留言:
在C++中,分離類別實作和類別介面的做法有幾個優點:

  1. 編譯時可以減少因為修改而牽動的檔案數量,大幅降低檔案重新編譯的規模(Effective C++ 2nd #37, 3rd #31)
  2. 在提供別人編譯所需要的檔案時,可以成功讓人編譯,又不會導致自己的Source Code被看光,而破壞類別的封裝性,或被修改程式碼,破壞了類別的整體概念性。

基於以上兩點優點,一定要學下這一招。
去翻了一下Effective C++ 2rd #37,以下是以它的程式碼為基礎,所做的練習。

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

沒有留言:

第六章 工作類別
Working Classes

電腦時代        初期       1970~1980    21世紀
--------------------------------------------------->
思考程式        陳述式     常式              類別
設計的概念    (算式)  (副程式)      (物件導向)

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

沒有留言:

第五章 軟體建構中的設計
Design in Construction



5.1 設計中的挑戰
Design Challenges

核心話題「設計是什麼?」

設計是個棘手的問題
Design is a Wicked Problem

設計是沒有固定設計的流程
Design is a Sloppy Process

設計就是確定取捨和調整優先順序
Design is About Trade-Offs and Priorities

設計環繞限制
Design Involves Restrictions

設計是不確定的
Design Is Non-deteministic

設計是啟發學習的過程
Design is a Heuristic Process

設計是演化產生的
Design is Emergent