2013年7月15日 星期一

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. 尾處
檢查處之前的程式碼,至少會執行一次。
檢查處之後的程式碼,不一定會執行。



使用While迴圈的時機
When to Use a while Loop


不知道重覆多少次時(A.2.類)

    前測式迴圈
    Loop with Test at the Beginning

    while()
    {}

    後測試迴圈
    Loop with Test at the End

    do{}
    while();

    使用loop-with-exit迴圈的使用時機(中段結束)
    When to Use a loop-with-exit Loop

      正常的loop-with-exit迴圈
      Normal loop-with-exit Loops

      while(1){
      //...
      if (somethingHappen)
      break;
      //...
      }
      1. 結束條件放在同一處
      2. 單一出人口的結構(易於理解)
      3. 可讀性高,符合人對重複控制方式的思考概念

      不正常的loop-with-exit迴圈
      Abnormal loop-with-exit Loops

      goto Start;
      while(expression){
      //...
      Start:
      //...
      }
      雖然唯一出入口,但是有兩個問題
      1. 使用goto
      2. 導致混亂

使用For迴圈的時機
When to Use a for Loop

    執行一定次數的迴圈時
    for迴圈:「迴圈控制」、「迴圈內容」是分開的,用於簡單的用途
    for = foreach


16.2 控制迴圈
Controlling the Loop


迴圈可能發生的錯誤:
  1. 初始化不正確或漏掉了
  2. 累加器或其它迴圈控制變數沒有初始化
  3. 錯誤的巢狀結構
  4. 結束不正確
  5. 忘記使用迴圈變數的數值增加
  6. 迴圈索引值不正確

兩項守則
  1. 簡化!簡化!簡化!(維護迴圈控制的概念整理性)
  2. 迴圈內部視為常式(降低迴圈控制和迴圈內容的耦合)
    設計成黑盒子

進入迴圈
Entering the Loop

單一化
初始化變數(確定迴圈會開始)
無限迴圈 while(1)
固定次數 for() 不使用while,控制迴圈的程式可以包在一起
不固定次數 while() 不使用for,for的彈性會濫用

處理迴圈內容
Processing the Middle of the Loop

用{}包起來
避免空回圈、單一化迴圈功能
控制迴圈的部份留在開頭或結尾(確定迴圈會進行)

離開迴圈
Exiting the Loop

簡化迴圈終止的條件式(確定迴圈會結束)
迴圈結束後就不要使用迴圈索引值
考慮使用安全計數器

提早離開迴圈
Exiting Loops Early

在while中用break比bool變數好
太多break代表要拆成很多迴圈,而不是一個迴圈很多出口
使用continue是為了跳造迴圈主體大多數的code,若跳過的code少,就用if吧
如果語言支援,就用「break 標籤」的用法
謹慎使用break和continue
  單一陳述式->簡化迴圈
  使用break->增加迴圈複雜性

檢查端點
Checking Endpoints

三個要注意的地方:
  1. 第一次執行
  2. 最後一次執行
  3. 執行到一半
要在心中模擬這三種情況。
這是好的程式設計師和壞的程式設計師的差別。

使用迴圈變數
Using Loop Variables

使用整數或列舉
有意義的變數提高可讀性,但是要避免重覆
變數Scop限制在迴圈中

迴圈的理想長度為何?
How Long Should a Loop Be?

一目了然
不超過三層巢狀
長型迴圈->單一出口
簡單迴圈->可以用break、continue、多重出口、複雜的結束式


16.3 輕鬆建立迴圈-由內而外
Creating Loops Easily—from the Inside Out


  1. 用常數開始
  2. 在文字外圍加迴圈,用變數取代常數
  3. 重覆2.

16.4 迴圈與陣列間的關聯性
Correspondence Between Loops and Arrays


不一定有關係

沒有留言:

張貼留言