同樣的程式碼模式不斷重複出現,是該重新組織程式碼的訊號。

紅旗:重複(Red Flag: Repetition)#

同一段程式碼(或幾乎一樣的程式碼)反覆出現 → 表示你還沒找到正確的抽象。

處理方式 1:抽出方法#

把重複片段抽成單一方法,原本各處改為呼叫該方法。

何時最有效

  • 重複片段
  • 替代方法的簽章簡單

何時效果有限或反而更糟

情境說明
片段只有一兩行替換的好處不大
片段與環境互動複雜例如要存取大量區域變數,導致替代方法簽章臃腫(一堆 by-reference 參數),價值降低

處理方式 2:重組讓片段只執行一次#

範例:一個方法在多個位置會回傳錯誤,每個錯誤回傳前都要做相同的清理動作。

Figure 9.1: 處理多種封包類型——若封包過短就 LOG;此版本中 LOG 敘述被重複多次

  • 把清理程式碼移到方法最尾端
  • 在每個錯誤點 goto 到該段(在支援 goto 的語言)

Figure 9.2: Figure 9.1 的重組——只剩下單一 LOG 敘述(用 goto 從各錯誤點跳到尾端統一處理)

goto 普遍被認為是壞東西,濫用會讓程式碼難以解讀

但用於「從巢狀程式碼中跳脫」這類情境,它仍是可用的工具。

設計判斷#

去除重複的正確姿勢,不是「機械式抽方法」,而是找到能讓重複自然消失的更好結構